最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實(shí)現(xiàn)一個(gè)倒計(jì)時(shí)自定義控件

 更新時(shí)間:2022年02月13日 15:42:59   作者:鐘過(guò)人難留  
大家好,本篇文章主要講的是Android實(shí)現(xiàn)一個(gè)倒計(jì)時(shí)自定義控件,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下

(一)前言

Android 其實(shí)提供了一個(gè)倒計(jì)時(shí)控件叫做CountDownTimer,這個(gè)倒計(jì)時(shí)控件用起來(lái)也很簡(jiǎn)單,但是要按照我們想要的倒計(jì)時(shí)樣式去做就比較繁瑣了。比如說(shuō)我們希望倒計(jì)時(shí)按照我們想要的樣式展示HH:MM:SS或者是HH-MM-SS等樣式,或者希望如下展示:

在這里插入圖片描述

要做的工作就會(huì)比較繁瑣了,不是說(shuō)不能實(shí)現(xiàn),只是實(shí)現(xiàn)起來(lái)代價(jià)比較大,所以如果我們將其做成一個(gè)自定義的view,可以根據(jù)用戶(hù)傳進(jìn)來(lái)的樣式去做倒計(jì)時(shí)樣式的展示(注:本文的代碼未做這些樣式的功能,但是基于本文代碼很容易實(shí)現(xiàn)這個(gè)功能),下面就一起看看我實(shí)現(xiàn)的倒計(jì)時(shí)自定義控件吧。
(注;本文代碼不可直接使用到項(xiàng)目中,如果需要使用到項(xiàng)目中,還需要對(duì)代碼做處理,比如固定時(shí)間到顯示寬度,不然顯示時(shí)間時(shí)會(huì)出現(xiàn)跳躍和顯示不全對(duì)情況,例如可以測(cè)量“00:00:00”的寬度設(shè)置個(gè)顯示的view,或者讀者可以自己選擇解決的辦法,還有顯示的時(shí)候是否需要去掉字體的內(nèi)邊距,這個(gè)都需要讀者自己去決定,去掉內(nèi)邊距也簡(jiǎn)單,就是TextView的一個(gè)方法setIncludeFontPadding(false)就行了)
 

(二)效果展示

在這里插入圖片描述

這個(gè)倒計(jì)時(shí)是精確到了毫秒,但也可以根據(jù)自己的需求去修改。很簡(jiǎn)單將格式從“HH:MM:SS SSS ”改為“HH:MM:SS”就可以了

(三)實(shí)現(xiàn)思路

實(shí)現(xiàn)的思路其實(shí)很簡(jiǎn)單,繼承自一個(gè)TextView,參照系統(tǒng)的倒計(jì)時(shí)控件做一個(gè)封裝就可以了。
首先初始化需要倒計(jì)時(shí)的時(shí)間:

 public void init(long timeInFuture, long timeInterval){
        mTimeInFuture = timeInFuture;
        mTimeInterval = timeInterval;
        mStopTimeInFuture = SystemClock.elapsedRealtime() + mTimeInFuture;
        updateText(mStopTimeInFuture);
    }

timeInFuture 表示你要倒計(jì)時(shí)的一個(gè)時(shí)間長(zhǎng)度,比如說(shuō)10秒,3天,5天等,timeInterval表示時(shí)間間隔,即每次倒計(jì)時(shí)遞減多少時(shí)間,可以是1秒,2秒,3秒…,elapsedRealtime表示獲取從設(shè)備boot后經(jīng)歷的時(shí)間值,通過(guò)他加上我們的時(shí)間長(zhǎng)度,就可以準(zhǔn)備開(kāi)始倒計(jì)時(shí)了。

  public  void start() {
        mStarted = true;
        updateTimer();
    }

當(dāng)用戶(hù)調(diào)用start()函數(shù)時(shí),會(huì)調(diào)用updateTimer()函數(shù),這個(gè)函數(shù)會(huì)執(zhí)行倒計(jì)時(shí)的邏輯:

private void updateTimer() {
        boolean running = mVisible && mStarted && isShown();
        if(running != mRunning){
            if(running) {
                doCountDownTimer();
            }else{
                removeCallbacks(mTickRunnable);
            }
            mRunning = running;
        }

    }

從代碼中可知,只有控件可見(jiàn)并且時(shí)mStarted的情況下才會(huì)去做倒計(jì)時(shí)。倒計(jì)時(shí)的執(zhí)行函數(shù)doCountDownTimer如下:

 private void doCountDownTimer() {
        final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();
        if(millisLeft <= 0){
            onFinish();
        }else{
            long lastUpdateTextStart = SystemClock.elapsedRealtime();
            updateText(millisLeft);
            // take into account updateText() take time to execute
            long lastUpdateTextDuration = SystemClock.elapsedRealtime() - lastUpdateTextStart;
            long delay;

            if(millisLeft < mTimeInterval){
                delay = millisLeft - lastUpdateTextDuration;

                if(delay < 0) {
                    delay = 0;
                }
            } else {
                delay = mTimeInterval - lastUpdateTextDuration;
                while (delay < 0) {
                    delay += mTimeInterval;
                }
            }
            postDelayed(mTickRunnable,delay);
        }
    }

代碼很容易看懂,這個(gè)地方需要特別說(shuō)明的是,咱們的倒計(jì)時(shí)利用了view的postDelayed方法,lastUpdateTextDuration這個(gè)變量值記錄了上一次更新倒計(jì)時(shí)text所耗費(fèi)的時(shí)間,把這個(gè)時(shí)間考慮上會(huì)讓倒計(jì)時(shí)更加精確,因?yàn)樵赿emo為了演示的需要所以加了兩個(gè)按鈕,在秒殺時(shí),這個(gè)時(shí)間的精確性還是有要求的,如果差異太大的話(huà)會(huì)影響用戶(hù)體驗(yàn)。

文章開(kāi)頭說(shuō)可以讓時(shí)間顯示各種樣式,其實(shí)就是把時(shí)間中的每個(gè)字符分離出來(lái),這樣就能單獨(dú)的定義樣式了:

 private String formatTime(long now) {
        String split = " : ";
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss SSS", Locale.CHINA);
        String time = sdf.format(now).replace(" ",":");
        Log.d(TAG,"zhongxj: " + time);
        String[] time_arr = time.split(":");
        int hour = Integer.parseInt(time_arr[0]);
        Log.d(TAG,"zhongxj: before transform " + hour);
        hour-=8;
        Log.d(TAG,"zhongxj: " + hour);
        if(hour<10){
            time_arr[0] = "0"+hour;
        }else{
            time_arr[0] = "" + hour;
        }

        return time_arr[0] + split + time_arr[1] + split
                +time_arr[2] + split + time_arr[3];
    }

需要加樣式就設(shè)計(jì)好樣式后把分割好的字符填到樣式中就可以了?。?!

倒計(jì)時(shí)的邏輯其實(shí)是參照的系統(tǒng)倒計(jì)時(shí)的,這里有個(gè)自定義控件的小技巧,當(dāng)我們接到需求時(shí),先不要忙著去百度,因?yàn)榇蠊竞芏鄷r(shí)候設(shè)計(jì)的控件百度上很難找到的就算找到了可能也不符合要求,還可能會(huì)有隱藏的bug,這時(shí)可以參照Android系統(tǒng)是如何實(shí)現(xiàn)類(lèi)似的控件的,參照系統(tǒng)的控件做出來(lái)的自定義控件,效果和性能會(huì)相對(duì)好一些。先說(shuō)這么多,有問(wèn)題歡迎一起討論。

(三)代碼地址

代碼倉(cāng)庫(kù)使用的是國(guó)內(nèi)的gitee,推薦大家使用起來(lái)?。。?!
源碼地址

總結(jié)

到此這篇關(guān)于Android實(shí)現(xiàn)一個(gè)倒計(jì)時(shí)自定義控件的文章就介紹到這了,更多相關(guān)Android倒計(jì)時(shí)控件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

井陉县| 都兰县| 顺义区| 红河县| 涿鹿县| 承德县| 安丘市| 武汉市| 昌邑市| 长宁县| 郑州市| 榆中县| 文化| 华亭县| 楚雄市| 长沙县| 徐汇区| 平罗县| 乐昌市| 清徐县| 织金县| 定远县| 银川市| 平原县| 江西省| 班戈县| 九江县| 绥江县| 洪江市| 科技| 灵宝市| 洞头县| 芦山县| 焉耆| 东山县| 柯坪县| 邛崃市| 乌拉特后旗| 柏乡县| 仙游县| 南充市|