本文实例为大家分享了Chronometer实现倒计时功能,Android提供了实现按照秒计时的API,供大家参考,具体内容如下
一、自定义ChronometerView 继续自TextView
主要原理:先设置一个基准倒计时时间mbaseSeconds,内置handler 每隔1s发送一个空消息,mRemainSeconds--,同时刷新界面视图,回调给外部调用者,只到为零。外部调用者可通过start()/pause()/stop()来控制计时器的工作状态。
可以app中发送短信验证码的场景为例,做了一个很粗糙的界面,但功能都实现了。
public class ChronometerView extends TextView {
public interface onTickChangeListener {
public void onTickChanged(ChronometerView view, long remainSeconds);
}
private long mbase;
private long mRemainSeconds;
private boolean mStarted;
private boolean mReStart;
private boolean mVisible;
private boolean mIsEnable;
private onTickChangeListener mTickListener;
public ChronometerView(Context context) {
this(context, null);
}
public ChronometerView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
}
public ChronometerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
updateText(mRemainSeconds);
}
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
mVisible = visibility == VISIBLE;
updateStatus();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mVisible = false;
updateStatus();
}
public void start() {
if (mReStart && !mStarted) {
mRemainSeconds = mbase;
}
mStarted = true;
updateStatus();
}
public void pause() {
if (mStarted) {
mStarted = mReStart = false;
updateStatus();
}
}
public void stop() {
mStarted = false;
mReStart = true;
updateStatus();
updateText(mRemainSeconds = 0);
dispatchTickListener();
}
private void updateStatus() {
boolean isEnable = mVisible && mStarted;
if (mIsEnable != isEnable) {
if (isEnable) {
mHandler.sendMessage(Message.obtain(mHandler, TICK_WHAT));
} else {
mHandler.removeMessages(TICK_WHAT);
}
mIsEnable = isEnable;
}
}
private static final int TICK_WHAT = 1;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (mRemainSeconds > 0) {
updateText(--mRemainSeconds);
dispatchTickListener();
sendMessageDelayed(Message.obtain(this, TICK_WHAT), 1000);
}
}
};
private void updateText(long now) {
String text = DateUtils.formatElapsedTime(now);
setText(text);
}
public void setbaseSeconds(long baseSeconds) {
if (baseSeconds > 0 && baseSeconds != mbase && !mStarted) {
mbase = mRemainSeconds = baseSeconds;
updateText(mRemainSeconds);
}
}
public long getRemainSeconds() {
return mRemainSeconds;
}
public void setonTickChangeListener(onTickChangeListener listener) {
mTickListener = listener;
}
public onTickChangeListener getTickListener() {
return mTickListener;
}
private void dispatchTickListener() {
if (mTickListener != null) {
mTickListener.onTickChanged(this, getRemainSeconds());
}
}
@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
event.setClassName(ChronometerView.class.getName());
}
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(Chronometer.class.getName());
}
}
二、xml 中没有加入自定义的控件属性,同TextView
三、在Activity中做一个简单的测试(可以发送短信验证码的实际应用场景为例)
public class ChronometerActivity extends Activity {
private ChronometerView mChronometerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clock);
// 自定义计时器
if (mChronometerView == null) {
mChronometerView = (ChronometerView) findViewById(R.id.chronometer_view);
mChronometerView.setbaseSeconds(60);
mChronometerView.setonTickChangeListener(new onTickChangeListener() {
@Override
public void onTickChanged(ChronometerView view, long curTimeMills) {
System.out.println(curTimeMills);
view.setEnabled(curTimeMills == 0 || curTimeMills == 60);
if (curTimeMills == 0) {
mChronometerView.setText("重新发送");
}
}
});
mChronometerView.setText("点击发送验证码");
}
findViewById(R.id.start_chronometer_view_btn).setonClickListener(mClickListener);
findViewById(R.id.pause_chronometer_view_btn).setonClickListener(mClickListener);
findViewById(R.id.stop_chronometer_view_btn).setonClickListener(mClickListener);
}
private View.onClickListener mClickListener = new onClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.start_chronometer_view_btn:
if (mChronometerView != null) {
mChronometerView.start();
}
break;
case R.id.pause_chronometer_view_btn:
if (mChronometerView != null) {
mChronometerView.pause();
}
break;
case R.id.stop_chronometer_view_btn:
if (mChronometerView != null) {
mChronometerView.stop();
}
break;
}
}
};
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



