簡介:
StrategyCountDownTextView,用策略模式封裝的倒計時控件竹伸。要顯示不同的時間格式勋篓、文案風(fēng)格生巡,使用時只需設(shè)置不同的顯示策略即可。(要改裝成實現(xiàn)順序計時也很簡單盐股,文末會提及疯汁。)
需求背景
最近項目中要做個限時活動模塊幌蚊,里面有大量的地方要有倒計時效果溢豆,可是不同地方顯示的倒計時格式有點區(qū)別,例如"HH小時mm分ss秒 后結(jié)束"队他, "還剩 HH:mm:ss"的麸折,帶不同的文案風(fēng)格垢啼。于是自己封裝了個倒計時控件膊夹,繼承TextView,而具體的文案怎么顯示进统,可以在代碼中動態(tài)設(shè)置螟碎,靈活性較高掉分。采用了設(shè)計模式中的策略模式酥郭,感覺很適合這個業(yè)務(wù)場景惜姐。
效果演示:
用法:
首先在要用到的頁面xml中引入控件,沒有自定義屬性条舔,
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.example.alberthuang.strategycountdowndemo.ui.customview.StrategyCountDownTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
然后設(shè)置結(jié)束時間和顯示策略,(倒計時監(jiān)聽可以選擇不設(shè)置夸浅,具體看業(yè)務(wù)需要)
private String mTimeStr = "2026-05-20 10:00:00";
//初始化倒計時控件
mCountDownTextView.setTimes(mTimeStr);
//設(shè)置顯示策略
mCountDownTextView.setCountDownStrategy(new StrategyCountDownTextView.CountDownStrategy() {
@Override
public String getTikTokText(String timeStr) {
return "This is StrategyOne\n倒計時:" + TimeUtil.getCountDownStrategyOneTime(timeStr);
}
@Override
public String getEndStr(String timeStr) {
return "This is StrategyOne\n倒計時已在" + timeStr + "結(jié)束";
}
});
//設(shè)置回調(diào),可以不設(shè)置
mCountDownTextView.setCountDownEventListener(new StrategyCountDownTextView.CountDownEventListener() {
@Override
public void onTikTok(String endTimeStr) {
Log.d("Callback_onTikTok", "time: " + endTimeStr);
}
@Override
public void onCountEnd(String endTimeStr) {
Log.d("Callback_onCountEnd", "time: " + endTimeStr);
}
});
關(guān)鍵的就是兩步,setTimes() 和 setCountDownStrategy()婉刀。要顯示不同風(fēng)格的時間格式和文案突颊,只需要setCountDownStrategy()時定義實現(xiàn)了CountDownStrategy接口的匿名內(nèi)部類就可以了。
改裝成實現(xiàn)順序計時:
要改裝成順序計時也很簡單棒动,也就是顯示目標(biāo)時間距離現(xiàn)在已經(jīng)“HH小時mm分ss秒”的樣式〈遥現(xiàn)在的機制是通過handler每隔1秒發(fā)送消息掷漱,然后在handleMessage()里更新顯示,其實這個機制也適用于順序計時海雪,只是我們現(xiàn)在在處理handler消息時進行時奥裸,寫死了顯示邏輯為倒計時。如果我們想顯示順序計時侠鳄,那么處理邏輯更加簡單:
private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
setText(mCountUpStrategy.getTikTokText(mEndTimeStr));//設(shè)置顯示的字符串
break;
}
}
};
不用判斷是否已到了結(jié)束時間,沒了結(jié)束時間這個概念博秫。只需直接執(zhí)行更新文字的代碼就可以了挡育。