Android 自定义View之倒计时实例代码
程序员文章站
2024-02-06 17:55:28
android 自定义view之倒计时实例代码
需求:
大多数app在注册的时候,都有一个获取验证码的按钮,点击后,访问接口,最终用户会收到短信验证码。为了不多次写...
android 自定义view之倒计时实例代码
需求:
大多数app在注册的时候,都有一个获取验证码的按钮,点击后,访问接口,最终用户会收到短信验证码。为了不多次写这个获取验证码的接口,下面将它自定义成一个view,方便使用。
分析一下,这是一个textview,点击的时候变色,不能再点击,同时里面的倒计时开始显示。那么就有了下面的代码
代码:
/** * 通过selector选择器来改变背景,其中倒计时运行时为android:state_enabled="true", * 不显示倒计时时为android:state_enabled="false"; * */ public class countdownview extends textview { private long totalmills = 10 * 1000;//倒计时的总时间,根据需要更改这个值 private long interval = 1000;//倒计时的时间间隔 public countdownview(context context) { super(context); } public countdownview(context context, attributeset attrs) { super(context, attrs); } public countdownview(context context, attributeset attrs, int defstyle) { super(context, attrs, defstyle); } private timecount mtimecount; private void startcount(long totalmills, long countdowninterval) { if (mtimecount == null) mtimecount = new timecount(totalmills, countdowninterval); mtimecount.start(); } public void start(){ defaulttext = gettext().tostring(); startcount(totalmills, interval); } public void cancel() { if (mtimecount != null){ mtimecount.onfinish(); mtimecount.cancel(); } } string defaulttext = "";//获取到在点击之前的文本内容 class timecount extends countdowntimer { public timecount(long millisinfuture, long countdowninterval) { super(millisinfuture, countdowninterval); } @override public void ontick(long millisuntilfinished) { setenabled(false); settext(millisuntilfinished / 1000 + "s"); } @override public void onfinish() { setenabled(true); settext(defaulttext); } } }
测试代码:
public class mainactivity extends activity implements onclicklistener { private countdownview mcountdownview; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mcountdownview = (countdownview) findviewbyid(r.id.tv_1); mcountdownview.setonclicklistener(this); findviewbyid(r.id.tv_2).setonclicklistener(this); } int count = 0; demothread thread; @override public void onclick(view v) { if(v.getid() == r.id.tv_1){ mcountdownview.start(); thread = new demothread(); thread.start(); } else if (v.getid() == r.id.tv_2) { mcountdownview.cancel(); system.out.println("wisely 取消倒计时"); } } class demothread extends thread{ @override public void run() { while (count < 10) { systemclock.sleep(100); count++; system.out.println("wisely count:" + count); } } } }
总结:
1、使用的时候,为该控件设置点击事件,然后调用start()方法,剩下的就是你自己的代码,一般都是联网调接口。
2、获取验证码的控件背景可以设置为selector选择器,设置android:state_enabled属性。上面例子的selector选择器代码如下:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_enabled="true" android:drawable="@color/green"/> <item android:state_enabled="false" android:drawable="@color/red"/> </selector>
3、在退出activity时,记得调用控件的cancel方法销毁它,否则会造成内存泄露。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!