自定义View之倒计时

本文详细介绍了如何在Android应用中创建一个自定义View,用于实现倒计时功能。从需求分析到代码实现,再到测试代码的编写,全方位展示了自定义View的完整过程,最后进行了总结,强调了关键技术和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


需求:

大多数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方法销毁它,否则会造成内存泄露。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值