
A timer which extends a View, you can use it to start a countdown if you need.
Copy the TimerView.java into your project. Then directly use TimerView element in xml like this:
Where com.ym.littleshape is your package name
And in Java:
timerView = (TimerView)findViewById(R.id.timer_view);
And then there will be a basic TimerView in your Activity: a circle and a point in the center.
Now you can use
timerView.startCountDown(long millis); timerView.cancelCountDown();
to start a timer for countdown or interruput it.
The end of the countdown can be listened: use
setOnEndCountDownListener(OnEndCountDownListener listener)
to set the listener and implement your callback.
MethodsYou can use several methods in timerView to customize your TimerView
- startCountDown(long millis)
-
cancelCountDown()
-
setCountDownInMillis(long countDownInMillis)
-
setGravityEnable(boolean enable)
- setBallClickEnable(boolean enable)
- setDefaultStartSettingEnable(boolean enable)
-
setDefaultStartCountDownEnable(boolean enable)
-
setOnStartCountDownListener(OnStartCountDownListener listener)
- setOnEndCountDownListener(OnEndCountDownListener listener)
- setOnCancelCountDownListener(OnCancelCountDownListener listener)
- setOnBallClickListener(OnBallClickListener listener)
- setOnBallLongClickListener(OnBallLongClickListener listener)
- setOnStartInteractiveSettingListener(OnStartInteractiveSettingListener listener)
- setOnConfirmInteractiveSettingListener(OnConfirmInteractiveSettingListener listener)
-
setOnCancelInteractiveSettingListener(OnCancelInteractiveSettingListener listener)
-
registerGravitySensor()
-
unregisterGravitySensor()
-
storeState()
-
restoreState(int rimColor)
-
cancelInteractiveSetting()
-
isSettingState()
Here are some typical usage example:
Ball affected by gravityThe little point in the center of the circle can move under the affect of gravity
@Override protected void onCreate(Bundle savedInstanceState) { ... timerView.setGravityEnable(true); } @Override protected void onResume() { super.onResume(); timerView.registerGravitySensor(); } @Override protected void onPause() { timerView.unregisterGravitySensor(); super.onPause(); }Ball affected by shaking
Shake your phone, the ball bounce. Haha, a little funny?
@Override protected void onCreate(Bundle savedInstanceState) { ... timerView.setShakeEnable(true); } @Override protected void onResume() { super.onResume(); timerView.registerGravitySensor(); } @Override protected void onPause() { timerView.unregisterGravitySensor(); super.onPause(); }Ball can be click or long click
@Override protected void onCreate(Bundle savedInstanceState) { ... timerView.setBallClickEnable(true); // then you can set these listeners for click callback timerView.setOnBallClickListener(new TimerView.OnBallClickListener() { @Override public void onBallClick() { Toast.makeText(MainActivity.this, "onBallClick", Toast.LENGTH_SHORT).show(); } }); timerView.setOnBallLongClickListener(new TimerView.OnBallLongClickListener() { @Override public void onBallLongClick() { Toast.makeText(MainActivity.this, "onBallLongClick", Toast.LENGTH_SHORT).show(); } }); }Use the default way to start a countdown
In this case, keep touch the TimerView and shake your phone, the count down will start.
@Override protected void onCreate(Bundle savedInstanceState) { ... timerView.setDefaultStartCountDownEnable(true); // set 5s countdown timerView.setCountDownInMillis(5000); // then you can set these listeners for callback timerView.setOnStartCountDownListener(new TimerView.OnStartCountDownListener() { @Override public void onStartCountDown(View v) { Toast.makeText(MainActivity.this, "onStartCountDown", Toast.LENGTH_SHORT).show(); } }); timerView.setOnEndCountDownListener(new TimerView.OnEndCountDownListener() { @Override public void onEndCountDown(View v) { Toast.makeText(MainActivity.this, "onEndCountDown", Toast.LENGTH_SHORT).show(); } }); timerView.setOnCancelCountDownListener(new TimerView.OnCancelCountDownListener() { @Override public void onCancelCountDown(View v) { Toast.makeText(MainActivity.this, "onCancelCountDown", Toast.LENGTH_SHORT).show(); } }); } @Override protected void onResume() { super.onResume(); timerView.registerGravitySensor(); } @Override protected void onPause() { timerView.unregisterGravitySensor(); super.onPause(); }Use the default way to set your time for countdown
In this case, keep touch the ball and then you will come into setting mode, slide your finger on the screen can set the coundown(in minute).
@Override protected void onCreate(Bundle savedInstanceState) { ... timerView.setDefaultStartSettingEnable(true); // the default way to start settint need to touch the ball timerView.setBallClickEnable(true); // then you can set these listeners for callback, such as a vibrating. timerView.setOnStartInteractiveSettingListener(new TimerView.OnStartInteractiveSettingListener() { @Override public void onStartInteractiveSetting(View v) { Toast.makeText(MainActivity.this, "onStartInteractiveSetting", Toast.LENGTH_SHORT).show(); Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE); long [] pattern = {0, 100}; vibrator.vibrate(pattern, -1); } }); timerView.setOnConfirmInteractiveSettingListener(new TimerView.OnConfirmInteractiveSettingListener() { @Override public void onConfirmInteractiveSetting(View v) { Toast.makeText(MainActivity.this, "onConfirmInteractiveSetting", Toast.LENGTH_SHORT).show(); Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE); long [] pattern = {0, 100}; vibrator.vibrate(pattern, -1); } }); timerView.setOnCancelInteractiveSettingListener(null); } @Override public void onBackPressed() { // here is a example to cancel setting if (timerView.isSettingState()) { timerView.cancelInteractiveSetting(); } else { super.onBackPressed(); } }Keep your countdown state
If you want to continue your countdown after restart the app, here is the example. The method storeState() reStoreState() will keep the necessary data into SharedPrefernce.
@Override protected void onCreate(Bundle savedInstanceState) { ... // 5 minutes timerView.startCountDown(300000); timerView.restoreState(); } @Override protected void onPause() { timerView.storeState(); super.onPause(); }