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:
<com.ym.littleshape.TimerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/timer_view"
android:padding="0dp" />
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.
You 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:
The 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();
}
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();
}
@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();
}
});
}
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();
}
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();
}
}
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();
}