【移動應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)倒計(jì)時的按鈕效果_第1頁
【移動應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)倒計(jì)時的按鈕效果_第2頁
【移動應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)倒計(jì)時的按鈕效果_第3頁
【移動應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)倒計(jì)時的按鈕效果_第4頁
【移動應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)倒計(jì)時的按鈕效果_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余2頁可下載查看

下載本文檔

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

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)倒計(jì)時的按鈕效果

這篇文章將為大家詳細(xì)講解有關(guān)Android如何實(shí)現(xiàn)倒計(jì)時的按鈕效果,在下覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。最近有人問我如何實(shí)現(xiàn)倒計(jì)時的按鈕功能,例如發(fā)送驗(yàn)證碼,我記得有個CountDownTimer,因?yàn)楹镁脹]用過了,自己就寫了一個,代碼如下new

CountDownTimer(10000,

1000)

{

@Override

public

void

onTick(long

millisUntilFinished)

{

btn2.setEnabled(false);

btn2.setText(String.format("%ds后重新發(fā)送驗(yàn)證碼",millisUntilFinished/1000));

}

@Override

public

void

onFinish()

{

btn2.setEnabled(true);

btn2.setText("發(fā)送驗(yàn)證碼");

}

}.start();點(diǎn)擊按鈕后開始倒計(jì)時,貌似很簡單啊,但是運(yùn)行起來發(fā)現(xiàn)有一些問題,先給大家看效果圖我們打印一下時間這里我們可以看到8這個秒數(shù)沒有出現(xiàn),并且最后1秒的時間有些長,每次點(diǎn)擊開始倒計(jì)時的時候偶爾就會出現(xiàn)少一個數(shù)字的問題,所以說這個東西是不精確的,網(wǎng)上也有很多人再說,那么有沒有其他的實(shí)現(xiàn)思路呢?這里我們來自定義一個倒計(jì)時的按鈕public

class

TimeButton

extends

Button

implements

View.OnClickListener

{

private

long

length

=

60

*

1000;//

倒計(jì)時長度,這里給了默認(rèn)60秒

private

String

textafter

=

"秒后重新獲取";

private

String

textbefore

=

"點(diǎn)擊獲取驗(yàn)證碼";

private

final

String

TIME

=

"time";

private

final

String

CTIME

=

"ctime";

private

OnClickListener

mOnclickListener;

private

Timer

t;

private

TimerTask

tt;

private

long

time;

private

Context

mContext;

Map<String,

Long>

map

=

new

HashMap<String,

Long>();

public

TimeButton(Context

context)

{

super(context);

setOnClickListener(this);

}

public

TimeButton(Context

context,

AttributeSet

attrs)

{

super(context,

attrs);

mContext

=

context;

setOnClickListener(this);

}

@SuppressLint("HandlerLeak")

Handler

han

=

new

Handler()

{

public

void

handleMessage(android.os.Message

msg)

{

TimeButton.this.setText(time

/

1000

+

textafter);

time

-=

1000;

if

(time

<

0)

{

TimeButton.this.setEnabled(true);

TimeButton.this.setText(textbefore);

clearTimer();

}

}

};

private

void

initTimer()

{

time

=

length;

t

=

new

Timer();

tt

=

new

TimerTask()

{

@Override

public

void

run()

{

Log.e("yung",

time

/

1000

+

"");

han.sendEmptyMessage(0x01);

}

};

}

private

void

clearTimer()

{

Toast.makeText(mContext,

"計(jì)時結(jié)束",

Toast.LENGTH_SHORT).show();

if

(tt

!=

null)

{

tt.cancel();

tt

=

null;

}

if

(t

!=

null)

t.cancel();

t

=

null;

}

@Override

public

void

setOnClickListener(OnClickListener

l)

{

if

(l

instanceof

TimeButton)

{

super.setOnClickListener(l);

}

else

this.mOnclickListener

=

l;

}

@Override

public

void

onClick(View

v)

{

if

(mOnclickListener

!=

null)

mOnclickListener.onClick(v);

initTimer();

this.setText(time

/

1000

+

textafter);

this.setEnabled(false);

t.schedule(tt,

0,

1000);

}

/**

*

和activity的onDestroy()方法同步

*/

public

void

onDestroy()

{

if

(MainActivity.map

==

null)

MainActivity.map

=

new

HashMap<String,

Long>();

MainActivity.map.put(TIME,

time);

MainActivity.map.put(CTIME,

System.currentTimeMillis());

clearTimer();

}

/**

*

和activity的onCreate()方法同步

*/

public

void

onCreate(Bundle

bundle)

{

Log.e("yung",

MainActivity.map

+

"");

if

(MainActivity.map

==

null)

return;

if

(MainActivity.map.size()

<=

0)//

這里表示沒有上次未完成的計(jì)時

return;

long

time

=

System.currentTimeMillis()

-

MainActivity.map.get(CTIME)

-

MainActivity.map.get(TIME);

MainActivity.map.clear();

if

(time

>

0)

return;

else

{

initTimer();

this.time

=

Math.abs(time);

t.schedule(tt,

0,

1000);

this.setText(time

+

textafter);

this.setEnabled(false);

}

}

/**

*

設(shè)置計(jì)時時候顯示的文本

*/

public

TimeButton

setTextAfter(String

text1)

{

this.textafter

=

text1;

return

this;

}

/**

*

設(shè)置點(diǎn)擊之前的文本

*/

public

TimeButton

setTextBefore(String

text0)

{

this.textbefore

=

text0;

this.setText(textbefore);

return

this;

}

/**

*

設(shè)置到計(jì)時長度

*

*

@param

lenght

時間

默認(rèn)毫秒

*

@

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論