第一种实现方式:自定义倒计时类,实现Runnable接口
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button timeBtn;
public int T = 10; //倒计时时长
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timeBtn = (Button) findViewById(R.id.timeBtn);
timeBtn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.timeBtn:
new Thread(new MyCountDownTimer()).start();//开始执行
break;
}
}
/**
* 自定义倒计时类,实现Runnable接口
*/
class MyCountDownTimer implements Runnable{
@Override
public void run() {
//倒计时开始,循环
while (T > 0) {
mHandler.post(new Runnable() {
@Override
public void run() {
timeBtn.setClickable(false);
timeBtn.setText(T + "秒后重新开始");
}
});
try {
Thread.sleep(1000); //强制线程休眠1秒,就是设置倒计时的间隔时间为1秒。
} catch (InterruptedException e) {
e.printStackTrace();
}
T--;
}
//倒计时结束,也就是循环结束
mHandler.post(new Runnable() {
@Override
public void run() {
timeBtn.setClickable(true);
timeBtn.setText("倒计时开始");
}
});
T = 10; //最后再恢复倒计时时长
}
}
}
第二种实现方式:自定义Button
public class CountDownTimerButton extends Button implements View.OnClickListener {
private Context mContext;
private OnClickListener mOnClickListener;
private Timer mTimer;//调度器
private TimerTask mTask;
private long duration = 10000;//倒计时时长 设置默认10秒
private long temp_duration;
private String clickBeffor = "倒计时开始";//点击前
private String clickAfter = "秒后重新开始";//点击后
public CountDownTimerButton(Context context) {
super(context);
mContext = context;
setOnClickListener(this);
}
public CountDownTimerButton(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
setOnClickListener(this);
}
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
CountDownTimerButton.this.setText(temp_duration/1000 + clickAfter);
temp_duration -= 1000;
if (temp_duration < 0) {//倒计时结束
CountDownTimerButton.this.setEnabled(true);
CountDownTimerButton.this.setText(clickBeffor);
stopTimer();
}
}
};
@Override
public void setOnClickListener(OnClickListener onClickListener) {//提供外部访问方法
if (onClickListener instanceof CountDownTimerButton) {
super.setOnClickListener(onClickListener);
}else{
this.mOnClickListener = onClickListener;
}
}
@Override
public void onClick(View view) {
if (mOnClickListener != null) {
mOnClickListener.onClick(view);
}
startTimer();
}
//计时开始
private void startTimer(){
temp_duration = duration;
CountDownTimerButton.this.setEnabled(false);
mTimer = new Timer();
mTask = new TimerTask() {
@Override
public void run() {
mHandler.sendEmptyMessage(0x01);
}
};
mTimer.schedule(mTask, 0, 1000);//调度分配,延迟0秒,时间间隔为1秒
}
//计时结束
private void stopTimer(){
if (mTask != null) {
mTask.cancel();
mTask = null;
}
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
}
}
对应的Activity文件
public class MainActivity extends AppCompatActivity{
private CountDownTimerButton timeBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maind);
timeBtn = (CountDownTimerButton) findViewById(R.id.timeBtn);
timeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(ThirdActivity.this, "倒计时开始", Toast.LENGTH_SHORT).show();
}
});
}
}
对应的xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.hbh.cl.countdowntimerdemo.MainActivity">
<com.hbh.cl.view.CountDownTimerButton
android:id="@+id/timeBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/start"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/timeBtn"
android:text="Third Activity"/>
</RelativeLayout>
第三种实现方式:使用 CountDownTimer
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button timeBtn;
private CountDownTime mTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timeBtn = (Button) findViewById(R.id.timeBtn);
timeBtn.setOnClickListener(this);
mTime = new CountDownTime(10000, 1000);//初始化对象
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.timeBtn:
mTime.start(); //开始计时
break;
}
}
/**
* 第一种方法 使用android封装好的 CountDownTimer
* 创建一个类继承 CountDownTimer
*/
class CountDownTime extends CountDownTimer{
//构造函数 第一个参数代表总的计时时长 第二个参数代表计时间隔 单位都是毫秒
public CountDownTime(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long l) { //每计时一次回调一次该方法
timeBtn.setClickable(false);
timeBtn.setText(l/1000 + "秒后重新开始");
}
@Override
public void onFinish() { //计时结束回调该方法
timeBtn.setClickable(true);
timeBtn.setText("倒计时开始");
}
}
本文详细介绍在Android应用中实现倒计时功能的三种方法:自定义类实现Runnable接口、自定义Button组件以及使用CountDownTimer类。每种方法都提供了具体的代码实现,帮助开发者理解和应用。
549

被折叠的 条评论
为什么被折叠?



