【移動應(yīng)用開發(fā)技術(shù)】Android中怎么利用CountDownTimer實現(xiàn)驗證碼倒計時效果_第1頁
【移動應(yīng)用開發(fā)技術(shù)】Android中怎么利用CountDownTimer實現(xiàn)驗證碼倒計時效果_第2頁
【移動應(yīng)用開發(fā)技術(shù)】Android中怎么利用CountDownTimer實現(xiàn)驗證碼倒計時效果_第3頁
【移動應(yīng)用開發(fā)技術(shù)】Android中怎么利用CountDownTimer實現(xiàn)驗證碼倒計時效果_第4頁
【移動應(yīng)用開發(fā)技術(shù)】Android中怎么利用CountDownTimer實現(xiàn)驗證碼倒計時效果_第5頁
免費預(yù)覽已結(jié)束,剩余2頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】Android中怎么利用CountDownTimer實現(xiàn)驗證碼倒計時效果

今天就跟大家聊聊有關(guān)Android中怎么利用CountDownTimer實現(xiàn)驗證碼倒計時效果,可能很多人都不太了解,為了讓大家更加了解,在下給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。1、需求分析點擊按鈕之后,按鈕文字變?yōu)椤皀s后發(fā)送驗證碼”(n為倒計時讀數(shù));為了讓倒計時更加醒目,將秒數(shù)和單位設(shè)為藍(lán)色;倒計時結(jié)束之后,按鈕的文字顯示為“重新發(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)建一個類繼承它,并實現(xiàn)它的構(gòu)造函數(shù)和重寫兩個方法:

private

CountTimer

countTimer;

/**

*

點擊按鈕后倒計時

*/

class

CountTimer

extends

CountDownTimer

{

public

CountTimer(long

millisInFuture,

long

countDownInterval)

{

super(millisInFuture,

countDownInterval);

}

/**

*

倒計時過程中調(diào)用

*

*

@param

millisUntilFinished

*/

@Override

public

void

onTick(long

millisUntilFinished)

{

}

/**

*

倒計時完成后調(diào)用

*/

@Override

public

void

onFinish()

{

}

}大體的框架如上所述,我來稍微解釋一下。首先是構(gòu)造函數(shù),里面有兩個參數(shù):millisInFuture:倒計時的總時間,單位為毫秒countDownInterval:倒計時的時間間隔,單位為毫秒比如我想設(shè)置10秒的倒計時,每隔1秒就讀一次數(shù),那么初始化就可以將數(shù)值傳入:CountTimer

countTimer

=

=

new

CountTimer(10000,

1000);除了構(gòu)造函數(shù),還有兩個方法,它們的作用分別如下:onTick:倒計時過程中調(diào)用onFinish:倒計時結(jié)束后調(diào)用那么怎么開啟倒計時呢?只需要用countTimer去調(diào)用start方法就可以了。另外,為了節(jié)省資源,在Activity銷毀時應(yīng)該停止倒計時:

@Override

protected

void

onDestroy()

{

super.onDestroy();

countTimer.cancel();

}到這里,你應(yīng)該知道怎么使用如何使用CountDownTimer了吧?如果還有疑問,可以在文末下載完整的代碼。4、實現(xiàn)簡單的倒計時效果現(xiàn)在我們先來實現(xiàn)點擊按鈕后就進行倒計時讀數(shù)的效果,代碼如下:

CountTimer

countTimer

=

new

CountTimer(10000,

1000);

/**

*

點擊按鈕后倒計時

*/

class

CountTimer

extends

CountDownTimer

{

public

CountTimer(long

millisInFuture,

long

countDownInterval)

{

super(millisInFuture,

countDownInterval);

}

/**

*

倒計時過程中調(diào)用

*

*

@param

millisUntilFinished

*/

@Override

public

void

onTick(long

millisUntilFinished)

{

Log.e("Tag",

"倒計時="

+

(millisUntilFinished/1000));

btnCaptcha.setText(millisUntilFinished

/

1000

+

"s后重新發(fā)送");

//設(shè)置倒計時中的按鈕外觀

btnCaptcha.setClickable(false);//倒計時過程中將按鈕設(shè)置為不可點擊

btnCaptcha.setBackgroundColor(Color.parseColor("#c7c7c7"));

btnCaptcha.setTextColor(ContextCompat.getColor(context,

android.R.color.black));

btnCaptcha.setTextSize(16);

}

/**

*

倒計時完成后調(diào)用

*/

@Override

public

void

onFinish()

{

Log.e("Tag",

"倒計時完成");

//設(shè)置倒計時結(jié)束之后的按鈕樣式

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);

}

}倒計時的讀數(shù)是實時的,毫無疑問應(yīng)該在onTick方法中處理這些邏輯,倒計時完成后要將按鈕文字改為“重新發(fā)送”,這個可以交給onFinish。運行一下,點擊按鈕,倒計時成功出現(xiàn)了,但是再點幾次,詭異的事情發(fā)生了:有時候倒計時讀數(shù)會漏掉某個數(shù)字,比如從10直接就到8了,打印出來的日志是這樣的:這……到底是怎么回事?少掉的一秒難道是被某人給續(xù)了么?5、CountDownTimer誤差解決為了找回生命中的這一秒鐘,我在一個技術(shù)群里和小伙伴們討論了很久,最后算是逃過了時間黑洞的魔爪。我們采用的倒計時讀數(shù)是將millisUntilFinished除于1000得到的,這里就有一個小小的陷阱了:millisUntilFinished是長整型變量,除于1000之后得到是整數(shù)部分。我們可以將millisUntilFinished的值打印出來看看:現(xiàn)在明白為什么看不到讀數(shù)9了嗎?那是因為程序執(zhí)行雖然很快,但再快也是需要時間的,所以從10秒倒計時到9秒時,millisUntilFinished會比9000稍小一點,是8999,而長整型8999除于1000之后就得到8了。當(dāng)然,既然是誤差那就有多種情況,少掉的數(shù)字不一定是9,這里只是我針對我遇到的情況而言。知道原因之后就好辦了,我們可以先將millisUntilFinished轉(zhuǎn)換成double類型后再除于1000,這樣就可以保留小數(shù)部分了,然后使用Math類中的round方法四舍五入,但是這樣倒計時的話會從10到2,這顯然不行,所以再減去1,讓它從9到1。修改后的onTick方法代碼是這樣的:

public

void

onTick(long

millisUntilFinished)

{

//處理后的倒計時數(shù)值

int

time

=

(int)

(Math.round((double)

millisUntilFinished

/

1000)

-

1);

btnCaptcha.setText(String.valueOf(time)+"s后重新發(fā)送");

//設(shè)置倒計時中的按鈕外觀

btnCaptcha.setClickable(false);//倒計時過程中將按鈕設(shè)置為不可點擊

btnCaptcha.setBackgroundColor(Color.parseColor("#c7c7c7"));

btnCaptcha.setTextColor(ContextCompat.getColor(context,

android.R.color.black));

btnCaptcha.setTextSize(16);

}運行后試試,就可以發(fā)現(xiàn)失去的那一秒又回來啦。6、給倒計時讀數(shù)和單位設(shè)置前景色給同一字符串中的不同字符設(shè)置不同的字體顏色,這就需要用到SpannableString與SpannableStringBuilder相關(guān)的知識了,限于篇幅,這里就不贅述了,可以參考這篇文章: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設(shè)置要顯示的文字樣式

//字符“后”在字符串中的下標(biāo)

int

index

=

String.valueOf(sb).indexOf("后");

/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論