業(yè)務(wù)場景
驗(yàn)證碼倒計(jì)時效果在 App 登錄模塊中很常見,它涉及到這么幾個技術(shù)點(diǎn):
1. 控件點(diǎn)擊事件
2. 定時器
3. 動態(tài)改變控件內(nèi)容
本文通過繼承TextView將這幾個技術(shù)點(diǎn)封裝在一個自定義控件中。其中控件點(diǎn)擊事件和動態(tài)改變控件內(nèi)容都很簡單,只需要調(diào)用TextView的`setOnClickListener()` 和 `setText()`。
定時器
定時器有多種實(shí)現(xiàn)方式,比如 `java.util.Timer` 或者線程池。其實(shí)用Handler也可以實(shí)現(xiàn)定時器。
定時器的本質(zhì)是以一定時間間隔重復(fù)相同的任務(wù)。`Handler.postDelay(Runnable r, long delayMillis)` 這個 Api 以一定延遲將任務(wù)插入消息隊(duì)列執(zhí)行。如果任務(wù)在執(zhí)行完之后可以將自己再次插入消息隊(duì)列,如此不停循環(huán)就可以實(shí)現(xiàn)定時器的效果。代碼如下
```
final Handler handler =new Handler();
//具有自我重復(fù)執(zhí)行能力的任務(wù)
Runnable runnable =new Runnable() {
@Override
? ? public void run() {
? ? ? ? //每隔1000ms將自己再次插入消息隊(duì)列
????????handler.postDelayed(this, 1000);
? ? }
};
//啟動任務(wù)
handler.post(runnable);
```
本文的自定義控件就使用了這個方法來實(shí)現(xiàn)定時器。
業(yè)務(wù)邏輯
除了上述的技術(shù)點(diǎn)之外,驗(yàn)證碼倒計(jì)時效果還牽涉到如下業(yè)務(wù)邏輯:
1. 點(diǎn)擊控件時開始計(jì)時
2. 計(jì)時期間不能再次被點(diǎn)擊
3. 計(jì)時結(jié)束后控件還原成初始狀態(tài)
如果這些業(yè)務(wù)邏輯代碼被收納在一個類中而不是散落在Activity類的各個地方,Activity層面的代碼就會更加整潔,業(yè)務(wù)邏輯也更容易被理解。
這可能不算是一個自定義View,但是它做了合理的封裝。