logo头像

博学广问,自律静思

安卓实现倒计时按钮效果

安卓手机管家类软件,在对手机的应用权限进行管理时常常会跳出这样的弹出框。 button 这样的按钮出现在很多场合,系统会给一定时间比如30s提示用户选择操作“禁止”还是“允许”,并设置倒计时,并在倒计时为零后系统会为用户选择默认行为执行。这个设计十分智能化,在无人使用手机时实现了自动化处理。下面介绍使用handler和Runnable实现这样的按钮是效果:

安卓实现倒计时按钮效果

在极客人的一篇转载文章《Android使用线程更新UI的几种方法》中,提到了用在Android里使用 Runnable和 Handler.PostDelayed(Runnable,Time) 定时更新界面。下面我讲解的便是使用Runnable和 Handler.PostDelayed(Runnable,Time) 实现倒计时效果的按钮。 假设点击倒计时按钮的动作为运行函数 function(),按钮变量名为forbiddenBtn下面是实现的代码:

Handler timerHandler = new Handler();
int autoRun=30;//设置倒计时时间30s
second=autoRun;
Runnable timerRunnable = new Runnable() {
@Override
public void run() {
if (second == 0) {
forbiddenBtn.setText(“禁止”);
timerHandler.removeCallbacks(timerRunnable);//清除定时
second =autoRun;
function();//执行默认操作
} else {
forbiddenBtn.setText(“禁止 (“ + second– + “秒…)”);
timerHandler.postDelayed(this, 1000);
}
}
};

原理

上面代码实现的原理是使用timeHander.postDelayed(context,int)函数定时调用一个Runnable呢,这里是延时1000ms执行一下timerRunnable。调用上述倒计时的代码为:

timerHandler.postDelayed(timerRunnable, 0);

即立即执行timerRunnable;当执行timerRunnable时,由于second初始化为30s,if语句执行else部分,second在button上显示出来后执行减1,然后通过timerHandler.postDelayed(this, 1000); 在1秒后再次执行timerRunnable,此时second=29……依此类推,当second=0时,就会执行function(),执行倒计时归零后的默认操作,

@轩菇凉 °
轩菇凉 ° commented at 2015-11-13

我想用这种格局写一个发送短信的,你可以帮帮忙吗?

@极客人
极客人 commented at 2015-11-11

不知道你具体怎么写的

@轩菇凉 °
轩菇凉 ° commented at 2015-11-11

就是这个地方报错的。。 你的这些代码是放在mainactivity里的是吧?

@极客人
极客人 commented at 2015-11-11

应该是别的地方报的吧

@轩然
轩然 commented at 2015-11-11

博主,能否问下,我复制你的代码出来的结果是这样的 Handler timerHandler = new Handler(); int autoRun=30;//设置倒计时时间30s 分号报错为什么? Syntax error on token ";", , expected