Android 自定義View之倒計時實例代碼
Android 自定義View之倒計時實例代碼
需求:
大多數(shù)app在注冊的時候,都有一個獲取驗證碼的按鈕,點擊后,訪問接口,最終用戶會收到短信驗證碼。為了不多次寫這個獲取驗證碼的接口,下面將它自定義成一個view,方便使用。
分析一下,這是一個TextView,點擊的時候變色,不能再點擊,同時里面的倒計時開始顯示。那么就有了下面的代碼
代碼:
/**
* 通過selector選擇器來改變背景,其中倒計時運行時為android:state_enabled="true",
* 不顯示倒計時時為android:state_enabled="false";
* */
public class CountDownView extends TextView {
private long totalMills = 10 * 1000;//倒計時的總時間,根據(jù)需要更改這個值
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 = "";//獲取到在點擊之前的文本內(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);
}
}
}
測試代碼:
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);
}
}
}
}
總結(jié):
1、使用的時候,為該控件設置點擊事件,然后調(diào)用start()方法,剩下的就是你自己的代碼,一般都是聯(lián)網(wǎng)調(diào)接口。
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時,記得調(diào)用控件的cancel方法銷毀它,否則會造成內(nèi)存泄露。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android中fragment+viewpager實現(xiàn)布局
這篇文章主要為大家詳細介紹了Android中fragment+viewpager實現(xiàn)布局效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
Android Studio下的APP目錄結(jié)構(gòu)詳解
這篇文章主要介紹了AndroidStudio下的APP目錄結(jié)構(gòu),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
android自定義開關(guān)控件-SlideSwitch的實例
本篇文章主要介紹了android自定義開關(guān)控件-SlideSwitch的實例,實現(xiàn)了手機控件開關(guān)的功能,感興趣的小伙伴們可以參考一下。2016-11-11
Android應用自動跳轉(zhuǎn)到應用市場詳情頁面的方法
最近在工作中遇到一個需求,推廣部門要求實現(xiàn)應用自動跳轉(zhuǎn)到應用市場詳情頁面,通過查找一些資料,實現(xiàn)出來了,覺得有必要整理下方便以后或者有需要的朋友們參考借鑒,下面來一起詳細看看Android應用自動跳轉(zhuǎn)到應用市場詳情頁面的方法吧。2016-12-12
Android fragment 轉(zhuǎn)場動畫創(chuàng)建步驟
在 Android 中,可以使用 setCustomAnimations() 方法來繪制自定義的 Fragment 轉(zhuǎn)場動畫,本文分步驟給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-03-03

