Android自定義控件實(shí)現(xiàn)驗(yàn)證碼倒計(jì)時(shí)
今天給大家?guī)硪粋€(gè)新的控件——驗(yàn)證碼倒計(jì)時(shí),先看下效果圖
1 效果演示

2 使用方式
<com.landptf.view.CountDownM
android:id="@+id/cdm_identifying_code"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_alignParentRight="true"
android:text="獲取驗(yàn)證碼"
landptf:backColor="@color/colorPrimary"
landptf:countDownSeconds="10"/>
CountDownM cdmIdentifyingCode = (CountDownM) findViewById(R.id.cdm_identifying_code);
if (cdmIdentifyingCode != null) {
cdmIdentifyingCode.setOnClickListener(new CountDownM.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(CountDownMTestActivity.this, "驗(yàn)證碼發(fā)送成功", Toast.LENGTH_SHORT).show();
}
});
}
以上幾行代碼即可實(shí)現(xiàn)倒計(jì)時(shí)的功能,這里面我們可以設(shè)置背景色以及倒計(jì)時(shí)的總時(shí)長(zhǎng)。
3 實(shí)現(xiàn)方法
/**
* Created by landptf on 2017/03/15.
* 獲取驗(yàn)證碼倒計(jì)時(shí)控件
*/
public class CountDownM extends ButtonM {
private OnClickListener onClickListener = null;
private CountDownTimer countDownTimer;
/**
* 倒計(jì)時(shí)總時(shí)長(zhǎng)
*/
private int countDownSeconds = 60;
/**
* 按鈕的背景色
*/
private int backColor = 0;
public interface OnClickListener{
void onClick(View v);
}
public CountDownM(Context context) {
this(context, null);
}
public CountDownM(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CountDownM(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.countDownM, defStyle, 0);
if (a != null) {
//設(shè)置背景色
ColorStateList colorList = a.getColorStateList(R.styleable.countDownM_backColor);
if (colorList != null) {
backColor = colorList.getColorForState(getDrawableState(), 0);
if (backColor != 0) {
setBackColor(backColor);
}
} else {
setBackColor(getResources().getColor(R.color.mainColor));
}
//獲取倒計(jì)時(shí)總時(shí)長(zhǎng)
int countDownSeconds = a.getInteger(R.styleable.countDownM_countDownSeconds, 60);
setCountDownSeconds(countDownSeconds);
a.recycle();
}
//設(shè)置文字顏色
setTextColor(getResources().getColor(android.R.color.white));
//設(shè)置位置相關(guān)屬性
setGravity(Gravity.CENTER);
setPadding(ConvertM.dp2px(context, 8), 0, ConvertM.dp2px(context, 8), 0);
setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickListener != null) {
onClickListener.onClick(v);
}
//點(diǎn)擊后開始計(jì)時(shí)
start();
}
});
}
/**
* 設(shè)置倒計(jì)時(shí)總時(shí)長(zhǎng)
* @param countDownSeconds
*/
public void setCountDownSeconds(int countDownSeconds){
this.countDownSeconds = countDownSeconds;
}
/**
* 設(shè)置背景色
* @param backColor
*/
@Override
public void setBackColor(int backColor) {
this.backColor = backColor;
super.setBackColor(backColor);
}
/**
* 停止倒計(jì)時(shí)
*/
public void stop(){
countDownTimer.cancel();
resetButton();
}
public void setOnClickListener(OnClickListener l){
this.onClickListener = l;
}
private void start(){
setEnabled(false);//設(shè)置不能點(diǎn)擊
countDownTimer = new CountDownTimer(countDownSeconds * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
setText(millisUntilFinished / 1000 + getResources().getString(R.string.count_down_m_recapture_after));//設(shè)置倒計(jì)時(shí)時(shí)間
//設(shè)置按鈕為灰色,這時(shí)是不能點(diǎn)擊的
CountDownM.super.setBackColor(Color.GRAY);
Spannable span = new SpannableString(getText().toString());//獲取按鈕的文字
span.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//講倒計(jì)時(shí)時(shí)間顯示為紅色
setText(span);
}
@Override
public void onFinish() {
resetButton();
}
};
countDownTimer.start();
}
private void resetButton(){
setText(getResources().getString(R.string.count_down_m_recapture));
setEnabled(true);//重新獲得點(diǎn)擊
if (backColor != 0) {
setBackColor(backColor);//還原背景色
} else {
setBackColor(getResources().getColor(R.color.mainColor));//還原背景色
}
}
}
代碼比較短,這里面繼承了ButtonM,有不了解的可以看一下我之前的博客
Android自定義控件系列(一)—Button七十二變
全部代碼已托管到開源中國(guó)的碼云上,歡迎下載,地址:https://git.oschina.net/landptf/landptf.git
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android?Jetpack庫(kù)剖析之ViewModel組件篇
這篇文章主要介紹了Android?Jetpack架構(gòu)組件?ViewModel詳解,ViewModel類讓數(shù)據(jù)可在發(fā)生屏幕旋轉(zhuǎn)等配置更改后繼續(xù)存在,ViewModel類旨在以注重生命周期的方式存儲(chǔ)和管理界面相關(guān)的數(shù)據(jù)。感興趣可以來學(xué)習(xí)一下2022-07-07
Android之使用Android-query框架開發(fā)實(shí)戰(zhàn)(一)
這篇文章主要介紹了Android之使用Android-query框架開發(fā)實(shí)戰(zhàn)(一)的相關(guān)資料,需要的朋友可以參考下2015-10-10
Android實(shí)現(xiàn)Unity3D下RTMP推送的示例
像Unity3D下的RTMP或RTSP播放器一樣,好多開發(fā)者苦于在Unity環(huán)境下,如何高效率低延遲的把數(shù)據(jù)采集并編碼實(shí)時(shí)推送到流媒體服務(wù)器,實(shí)現(xiàn)Unity場(chǎng)景下的低延遲推拉流方案。本文介紹幾種RTMP推送的方案2021-06-06
Android sqlite設(shè)置主鍵自增長(zhǎng)的方法教程
這篇文章主要給大家介紹了關(guān)于Android sqlite設(shè)置主鍵自增長(zhǎng)的方法教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
Android 實(shí)現(xiàn)帶字母索引的側(cè)邊欄功能
這篇文章主要介紹了Android 實(shí)現(xiàn)帶字母索引的側(cè)邊欄功能,需要的朋友可以參考下2017-08-08
Android編程實(shí)現(xiàn)識(shí)別與掛載U盤的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)識(shí)別與掛載U盤的方法,對(duì)比分析了Android針對(duì)U盤的識(shí)別與掛載技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-02-02
Android中應(yīng)用前后臺(tái)切換監(jiān)聽的實(shí)現(xiàn)詳解
這篇文章主要給大家介紹了關(guān)于Android中應(yīng)用前后臺(tái)切換監(jiān)聽實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07

