Android 自定義View之倒計(jì)時(shí)實(shí)例代碼
Android 自定義View之倒計(jì)時(shí)實(shí)例代碼
需求:
大多數(shù)app在注冊(cè)的時(shí)候,都有一個(gè)獲取驗(yàn)證碼的按鈕,點(diǎn)擊后,訪問接口,最終用戶會(huì)收到短信驗(yàn)證碼。為了不多次寫這個(gè)獲取驗(yàn)證碼的接口,下面將它自定義成一個(gè)view,方便使用。
分析一下,這是一個(gè)TextView,點(diǎn)擊的時(shí)候變色,不能再點(diǎn)擊,同時(shí)里面的倒計(jì)時(shí)開始顯示。那么就有了下面的代碼
代碼:
/** * 通過(guò)selector選擇器來(lái)改變背景,其中倒計(jì)時(shí)運(yùn)行時(shí)為android:state_enabled="true", * 不顯示倒計(jì)時(shí)時(shí)為android:state_enabled="false"; * */ public class CountDownView extends TextView { private long totalMills = 10 * 1000;//倒計(jì)時(shí)的總時(shí)間,根據(jù)需要更改這個(gè)值 private long interval = 1000;//倒計(jì)時(shí)的時(shí)間間隔 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 = "";//獲取到在點(diǎn)擊之前的文本內(nèi)容 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); } } }
測(cè)試代碼:
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 取消倒計(jì)時(shí)"); } } class DemoThread extends Thread{ @Override public void run() { while (count < 10) { SystemClock.sleep(100); count++; System.out.println("wisely count:" + count); } } } }
總結(jié):
1、使用的時(shí)候,為該控件設(shè)置點(diǎn)擊事件,然后調(diào)用start()方法,剩下的就是你自己的代碼,一般都是聯(lián)網(wǎng)調(diào)接口。
2、獲取驗(yàn)證碼的控件背景可以設(shè)置為selector選擇器,設(shè)置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時(shí),記得調(diào)用控件的cancel方法銷毀它,否則會(huì)造成內(nèi)存泄露。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android Intent 用法全面總結(jié)及實(shí)例代碼
這篇文章主要介紹了Android Intent 用法全面總結(jié)的相關(guān)資料,并附實(shí)例代碼,需要的朋友可以參考下2016-09-09Android自定義PopupWindow仿點(diǎn)擊彈出分享功能
這篇文章主要為大家詳細(xì)介紹了Android自定義PopupWindow仿點(diǎn)擊彈出分享功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Android自動(dòng)編輯文本框(AutoCompleteTextView)使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android自動(dòng)編輯文本框AutoCompleteTextView的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Thread、Handler和HandlerThread關(guān)系詳解
這篇文章主要介紹了Thread、Handler和HandlerThread關(guān)系詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09Android studio將Module打包成Jar的方法
這篇文章主要介紹了Android studio將Module打包成Jar的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10android開發(fā)之方形圓角listview代碼分享
我寫這篇文章受到了kiritor的專欄發(fā)表的博文Android UI控件之ListView實(shí)現(xiàn)圓角效果的啟發(fā)。2013-06-06