自定义View之倒计时
2015-11-29 14:11
447 查看
需求:
大多数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方法销毁它,否则会造成内存泄露。
相关文章推荐
- ios 相册 UINavigationController
- (一)Course Learning Objectives【The Arduino Platform and C Pro】
- Golang同步:原子操作使用
- 安装git
- Webkit之DOM加载&创建
- centos 7 安装mySql
- 学习--jquery 自定义插件 页面按照模块 垂直滚动
- 写小程序的工具
- Webkit之App层的分析
- 微信多客服开发
- 斐波纳挈数列的三种求法(java实现)
- share总结
- SpringMVC_非注解(注解)的处理器映射器和适配器
- 混合开发activity和html之间相互跳转
- 堆排序
- Android CircleProgress:可自由定制实现各种样式圆形加载进度
- HealthKit框架指南
- 从当前页面跳转到其他页面的某个地方
- Webkit之绘制Button分析
- 离屏渲染学习笔记