下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】Android中怎么利用CountDownTimer實現驗證碼倒計時效果
今天就跟大家聊聊有關Android中怎么利用CountDownTimer實現驗證碼倒計時效果,可能很多人都不太了解,為了讓大家更加了解,在下給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。1、需求分析點擊按鈕之后,按鈕文字變?yōu)椤皀s后發(fā)送驗證碼”(n為倒計時讀數);為了讓倒計時更加醒目,將秒數和單位設為藍色;倒計時結束之后,按鈕的文字顯示為“重新發(fā)送”。2、工程創(chuàng)建和布局編寫創(chuàng)建工程就不用多說了,由于我們只需要看到按鈕上的倒計時效果,不必輸入手機號碼,所以只要在界面上簡單地放置一個按鈕即可:<RelativeLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context="com.lindroid.countdowndemo.MainActivity">
<Button
android:id="@+id/btn_captcha"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#c7c7c7"
android:text="獲取驗證碼"
android:textAllCaps="false"
android:textColor="@android:color/black"
android:textSize="18sp"
/>
</RelativeLayout>3、如何使用CountDownTimerCountDownTimer倒計時器的使用并不難,我們可以創(chuàng)建一個類繼承它,并實現它的構造函數和重寫兩個方法:
private
CountTimer
countTimer;
/**
*
點擊按鈕后倒計時
*/
class
CountTimer
extends
CountDownTimer
{
public
CountTimer(long
millisInFuture,
long
countDownInterval)
{
super(millisInFuture,
countDownInterval);
}
/**
*
倒計時過程中調用
*
*
@param
millisUntilFinished
*/
@Override
public
void
onTick(long
millisUntilFinished)
{
}
/**
*
倒計時完成后調用
*/
@Override
public
void
onFinish()
{
}
}大體的框架如上所述,我來稍微解釋一下。首先是構造函數,里面有兩個參數:millisInFuture:倒計時的總時間,單位為毫秒countDownInterval:倒計時的時間間隔,單位為毫秒比如我想設置10秒的倒計時,每隔1秒就讀一次數,那么初始化就可以將數值傳入:CountTimer
countTimer
=
=
new
CountTimer(10000,
1000);除了構造函數,還有兩個方法,它們的作用分別如下:onTick:倒計時過程中調用onFinish:倒計時結束后調用那么怎么開啟倒計時呢?只需要用countTimer去調用start方法就可以了。另外,為了節(jié)省資源,在Activity銷毀時應該停止倒計時:
@Override
protected
void
onDestroy()
{
super.onDestroy();
countTimer.cancel();
}到這里,你應該知道怎么使用如何使用CountDownTimer了吧?如果還有疑問,可以在文末下載完整的代碼。4、實現簡單的倒計時效果現在我們先來實現點擊按鈕后就進行倒計時讀數的效果,代碼如下:
CountTimer
countTimer
=
new
CountTimer(10000,
1000);
/**
*
點擊按鈕后倒計時
*/
class
CountTimer
extends
CountDownTimer
{
public
CountTimer(long
millisInFuture,
long
countDownInterval)
{
super(millisInFuture,
countDownInterval);
}
/**
*
倒計時過程中調用
*
*
@param
millisUntilFinished
*/
@Override
public
void
onTick(long
millisUntilFinished)
{
Log.e("Tag",
"倒計時="
+
(millisUntilFinished/1000));
btnCaptcha.setText(millisUntilFinished
/
1000
+
"s后重新發(fā)送");
//設置倒計時中的按鈕外觀
btnCaptcha.setClickable(false);//倒計時過程中將按鈕設置為不可點擊
btnCaptcha.setBackgroundColor(Color.parseColor("#c7c7c7"));
btnCaptcha.setTextColor(ContextCompat.getColor(context,
android.R.color.black));
btnCaptcha.setTextSize(16);
}
/**
*
倒計時完成后調用
*/
@Override
public
void
onFinish()
{
Log.e("Tag",
"倒計時完成");
//設置倒計時結束之后的按鈕樣式
btnCaptcha.setBackgroundColor(ContextCompat.getColor(context,
android.R.color.holo_blue_light));
btnCaptcha.setTextColor(ContextCompat.getColor(context,
android.R.color.white));
btnCaptcha.setTextSize(18);
btnCaptcha.setText("重新發(fā)送");
btnCaptcha.setClickable(true);
}
}倒計時的讀數是實時的,毫無疑問應該在onTick方法中處理這些邏輯,倒計時完成后要將按鈕文字改為“重新發(fā)送”,這個可以交給onFinish。運行一下,點擊按鈕,倒計時成功出現了,但是再點幾次,詭異的事情發(fā)生了:有時候倒計時讀數會漏掉某個數字,比如從10直接就到8了,打印出來的日志是這樣的:這……到底是怎么回事?少掉的一秒難道是被某人給續(xù)了么?5、CountDownTimer誤差解決為了找回生命中的這一秒鐘,我在一個技術群里和小伙伴們討論了很久,最后算是逃過了時間黑洞的魔爪。我們采用的倒計時讀數是將millisUntilFinished除于1000得到的,這里就有一個小小的陷阱了:millisUntilFinished是長整型變量,除于1000之后得到是整數部分。我們可以將millisUntilFinished的值打印出來看看:現在明白為什么看不到讀數9了嗎?那是因為程序執(zhí)行雖然很快,但再快也是需要時間的,所以從10秒倒計時到9秒時,millisUntilFinished會比9000稍小一點,是8999,而長整型8999除于1000之后就得到8了。當然,既然是誤差那就有多種情況,少掉的數字不一定是9,這里只是我針對我遇到的情況而言。知道原因之后就好辦了,我們可以先將millisUntilFinished轉換成double類型后再除于1000,這樣就可以保留小數部分了,然后使用Math類中的round方法四舍五入,但是這樣倒計時的話會從10到2,這顯然不行,所以再減去1,讓它從9到1。修改后的onTick方法代碼是這樣的:
public
void
onTick(long
millisUntilFinished)
{
//處理后的倒計時數值
int
time
=
(int)
(Math.round((double)
millisUntilFinished
/
1000)
-
1);
btnCaptcha.setText(String.valueOf(time)+"s后重新發(fā)送");
//設置倒計時中的按鈕外觀
btnCaptcha.setClickable(false);//倒計時過程中將按鈕設置為不可點擊
btnCaptcha.setBackgroundColor(Color.parseColor("#c7c7c7"));
btnCaptcha.setTextColor(ContextCompat.getColor(context,
android.R.color.black));
btnCaptcha.setTextSize(16);
}運行后試試,就可以發(fā)現失去的那一秒又回來啦。6、給倒計時讀數和單位設置前景色給同一字符串中的不同字符設置不同的字體顏色,這就需要用到SpannableString與SpannableStringBuilder相關的知識了,限于篇幅,這里就不贅述了,可以參考這篇文章:SpannableString與SpannableStringBuilder。這里只簡單介紹一下:6.1拼接字符串
int
time
=
(int)
(Math.round((double)
millisUntilFinished
/
1000)
-
1);
//拼接要顯示的字符串
SpannableStringBuilder
sb
=
new
SpannableStringBuilder();
sb.append(String.valueOf(time));
sb.append("s后重新發(fā)送");6.2設置要顯示的文字樣式
//字符“后”在字符串中的下標
int
index
=
String.valueOf(sb).indexOf("后");
/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 美團騎手2025年度團隊協作與企業(yè)文化融入合同4篇
- 二零二五年度醫(yī)院護理人員專業(yè)發(fā)展合同4篇
- 2025年度數據中心冷卻系統(tǒng)承包合同4篇
- 2025年度冷庫制冷設備進出口貿易代理合同2篇
- 二零二五年度南京市高新園區(qū)房地產抵押租賃合同
- 二零二五年度新型木托盤租賃及信息化管理服務合同4篇
- 2025版新型節(jié)能門窗安裝與綠色建筑合同2篇
- 2025年度牛奶飲品國際市場拓展與海外銷售代理合同4篇
- 2025年專業(yè)培訓班股權投資與管理合同4篇
- 2025年度鋼構加工企業(yè)信用風險防范合同
- 小兒甲型流感護理查房
- 霧化吸入療法合理用藥專家共識(2024版)解讀
- 2021年全國高考物理真題試卷及解析(全國已卷)
- 拆遷評估機構選定方案
- 趣味知識問答100道
- 鋼管豎向承載力表
- 2024年新北師大版八年級上冊物理全冊教學課件(新版教材)
- 人教版數學四年級下冊核心素養(yǎng)目標全冊教學設計
- JJG 692-2010無創(chuàng)自動測量血壓計
- 三年級下冊口算天天100題(A4打印版)
- CSSD職業(yè)暴露與防護
評論
0/150
提交評論