Resource files for the boxing clock. Includes images and sounds. bca-res-boxing-clock-android.tar.gz.
// bca01helloGui - Create a simple graphical user interface // (c) Kimmo Karvinen & Tero Karvinen http://BotBook.com package fi.sulautetut.android.chessboxing; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class ChessBoxing extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.append("Welcome to BotBook.com Chess Boxing!"); setContentView(tv); } }
// bca08boxingClockReady - A usable boxing clock for Android. // (c) Kimmo Karvinen & Tero Karvinen http://BotBook.com package fi.sulautetut.android.animatedboxing; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class AnimatedBoxing extends Activity { private Handler handler; private PieView tPie; private long pieEnds; private long fightLen=3*60*1000; // ms private long breakLen=60*1000; private long pieStarted; // round or break, ms private boolean fight=true; // will be changed immediately private MediaPlayer fightSound; private MediaPlayer breakSound; private static final int MENU105=105; private static final int MENU21=21; private static final int MENU31=31; private int boxingRedColor = 0xffff2704; private TextView tv; private long programStarted; private long roundsStarted=0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); fightSound = MediaPlayer.create(this, R.raw.fightsound); breakSound = MediaPlayer.create(this, R.raw.breaksound); programStarted=SystemClock.uptimeMillis(); LinearLayout container=new LinearLayout(this); container.setOrientation(android.widget.LinearLayout.VERTICAL); tv = new TextView(this); tv.setText("Welcome to BotBook.com Boxing Clock!"); tv.setGravity(Gravity.CENTER); tv.setTextColor(boxingRedColor); tv.setBackgroundColor(Color.BLACK); tv.setPadding(5, 20, 5, 5); container.addView(tv); tPie = new PieView(this); container.addView(tPie); keepBackLightOn(); fullscreen(); setContentView(container); } public void onPause() { super.onPause(); Toast.makeText(this, "Bye bye! "+statusMessage(), Toast.LENGTH_LONG).show(); handler.removeCallbacks(update); } public void onResume() { super.onResume(); handler = new Handler(); handler.removeCallbacks(update); handler.postDelayed(update, 50); } public void keepBackLightOn() { getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } public void fullscreen() { requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } public boolean onCreateOptionsMenu(Menu menu) { menu.add(Menu.NONE, MENU105, 0, "10 s / 5 s"); menu.add(Menu.NONE, MENU21, 0, "2 min / 1 min"); menu.add(Menu.NONE, MENU31, 0, "3 min / 1 min"); return true; } public boolean onOptionsItemSelected(MenuItem item) { long now=SystemClock.uptimeMillis(); pieEnds=now; programStarted=now; fight=true; // will be changed immediately because pieEnds=now roundsStarted=0; switch (item.getItemId()) { case MENU105: fightLen = 10*1000; breakLen = 5*1000; Toast.makeText(this, "10 second round, 5 second break. ", Toast.LENGTH_LONG).show(); return true; // will exit, so a "break;" would be // unreachable case MENU21: fightLen = 2*60*1000; breakLen = 60*1000; Toast.makeText(this, "2 minute round, 1 minute break. ", Toast.LENGTH_LONG).show(); return true; case MENU31: fightLen = 3*60*1000; breakLen = 60*1000; Toast.makeText(this, "3 minute round, 1 minute break. ", Toast.LENGTH_LONG).show(); return true; } return false; } private String ms2mins(long ms) { // convert millisecond time to minutes and seconds int seconds = (int) (ms / 1000); int min = seconds / 60; int sec = seconds % 60; String pad; if (sec<10) pad="0"; else pad=""; return ""+ min +":"+pad+sec; } private String statusMessage() { String s=""; long totalElapsed=SystemClock.uptimeMillis()-programStarted; s+=ms2mins(totalElapsed); s+=" elapsed. "; if (fight) { s+="Round "; } else { s+="Break "; } s+=roundsStarted+"."; return s; } private Runnable update = new Runnable() { public void run() { long now=SystemClock.uptimeMillis(); if (pieEnds<now) { fight=!fight; pieStarted=now; if (fight) { // round starts roundsStarted++; pieEnds=pieStarted+fightLen; fightSound.start(); } else { // break starts pieEnds=pieStarted+breakLen; breakSound.start(); } } tv.setText(statusMessage()); tPie.fightColors=fight; tPie.percent=(float)(now-pieStarted)/(float)(pieEnds-pieStarted); tPie.invalidate(); handler.removeCallbacks(update); handler.postDelayed(this, 80); // ms } }; public class PieView extends View { public float percent; public boolean fightColors=false; Bitmap fightBg; Bitmap breakBg; public PieView(Context context) { super(context); fightBg=BitmapFactory.decodeResource(getResources(), R.drawable.clockfight); breakBg=BitmapFactory.decodeResource(getResources(), R.drawable.clockbreak); } public void onDraw(Canvas canvas) { canvas.drawColor(Color.BLACK); Paint paint = new Paint(); paint.setColor(Color.WHITE); float w=canvas.getWidth(); float h=canvas.getHeight(); float margin=10; // pixels from pie to nearest wall float r=(Math.min(h,w)-margin)/2; // ray, half diameter // center first - because we want it centered float cx=w/2; float liftCenter=-50; float cy=h/2+liftCenter; // top left float tx=cx-r; float ty=cy-r; // bottom right float bx=tx+2*r; float by=ty+2*r; RectF bgRect = new RectF(tx, ty, bx, by); RectF oval=new RectF(bgRect); // copy bgRect measures instead // of creating a reference oval.inset((int)(r*0.29), (int)(r*0.29)); if (fightColors) { canvas.drawBitmap(fightBg, null, bgRect, null); } else { canvas.drawBitmap(breakBg, null, bgRect, null); } canvas.drawArc(oval, -90, 360*percent, true, paint); } }; }
// bca05roundAndBreak - Round and break with different length and sound. // (c) Kimmo Karvinen & Tero Karvinen http://BotBook.com package fi.sulautetut.android.loudboxing; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; import android.widget.TextView; public class LoudBoxing extends Activity { private Handler handler; private TextView tv; private MediaPlayer fightSound; private MediaPlayer breakSound; private boolean fight=false; private long pieStarted; // round or break, ms private long pieEnds; private long fightLen=10*1000; // ms private long breakLen=5*1000; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tv = new TextView(this); tv.append("Welcome to BotBook.com Chess Boxing! "); setContentView(tv); fightSound= MediaPlayer.create(this, R.raw.fightsound ); breakSound= MediaPlayer.create(this, R.raw.breaksound ); handler = new Handler(); handler.removeCallbacks(update); handler.postDelayed(update, 50); } private Runnable update = new Runnable() { public void run() { if (pieEnds<SystemClock.uptimeMillis()) { fight=!fight; pieStarted=SystemClock.uptimeMillis(); if (fight) { // round starts pieEnds=pieStarted+fightLen; bk fightSound.start(); bl tv.setText("Fight! "); } else { bm pieEnds=pieStarted+breakLen; breakSound.start(); tv.setText("Break. "); } } handler.removeCallbacks(update); handler.postDelayed(this, 1000); } }; }
// bca06customView - Build custom view with green background // (c) Kimmo Karvinen & Tero Karvinen http://BotBook.com package fi.sulautetut.android.greencolor; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.view.View; public class GreenColor extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); PieView tPie = new PieView(this); setContentView(tPie); } public class PieView extends View { public PieView(Context context) { super(context); } public void onDraw(Canvas canvas) { canvas.drawColor(Color.GREEN); } } }
// bca03helloMp3 - Play a sound // (c) Kimmo Karvinen & Tero Karvinen http://BotBook.com package fi.sulautetut.android.hellomp3; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; public class HelloMp3 extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MediaPlayer fightSound = MediaPlayer.create(this, R.raw.fightsound); fightSound.start(); setContentView(R.layout.main); } }
// bca02chessBoxing - Timed events // (c) Kimmo Karvinen & Tero Karvinen http://BotBook.com package fi.sulautetut.android.chessboxing; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; public class ChessBoxing extends Activity { private Handler handler; private TextView tv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tv = new TextView(this); tv.append("Welcome to BotBook.com Chess Boxing! "); setContentView(tv); handler = new Handler(); handler.removeCallbacks(update); handler.postDelayed(update, 50); } private Runnable update = new Runnable() { public void run() { tv.append("Bling! "); handler.removeCallbacks(update); handler.postDelayed(this, 10*1000); } }; }
// bca04loudBoxing - Signal rounds with a gong sound. // (c) Kimmo Karvinen & Tero Karvinen http://BotBook.com package fi.sulautetut.android.loudboxing; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; public class LoudBoxing extends Activity { private Handler handler; private TextView tv; MediaPlayer fightSound; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tv = new TextView(this); tv.append("Welcome to BotBook.com Chess Boxing! "); setContentView(tv); fightSound= MediaPlayer.create(this, R.raw.fightsound ); handler = new Handler(); handler.removeCallbacks(update); handler.postDelayed(update, 50); } private Runnable update = new Runnable() { public void run() { fightSound.start(); tv.append("Bling! "); handler.removeCallbacks(update); handler.postDelayed(this, 10*1000); } }; }
// bca07animatedBoxing - Animated pie shows time left. // (c) Kimmo Karvinen & Tero Karvinen http://BotBook.com package fi.sulautetut.android.animatedboxing; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; import android.view.View; public class AnimatedBoxing extends Activity { private Handler handler; private PieView tPie; private long pieEnds; private long fightLen=10*1000; // ms private long pieStarted; // round or break, ms @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler(); handler.removeCallbacks(update); handler.postDelayed(update, 50); tPie = new PieView(this); setContentView(tPie); } private Runnable update = new Runnable() { public void run() { long now=SystemClock.uptimeMillis(); if (pieEnds<now) { pieStarted=now; pieEnds=pieStarted+fightLen; } tPie.percent= (float)(now-pieStarted)/(pieEnds-pieStarted); tPie.invalidate(); handler.removeCallbacks(update); handler.postDelayed(this, 50); // ms } }; public class PieView extends View { public float percent; public PieView(Context context) { super(context); } public void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.WHITE); RectF oval=new RectF(0, 0, canvas.getWidth(), canvas.getHeight()); canvas.drawArc(oval, 0, 360*percent, true, paint); } }; }