您好,登錄后才能下訂單哦!
這篇“Android如何實現一個倒計時自定義控件”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Android如何實現一個倒計時自定義控件”文章吧。
Android 其實提供了一個倒計時控件叫做CountDownTimer,這個倒計時控件用起來也很簡單,但是要按照我們想要的倒計時樣式去做就比較繁瑣了。比如說我們希望倒計時按照我們想要的樣式展示HH:MM:SS或者是HH-MM-SS等樣式,或者希望如下展示:
要做的工作就會比較繁瑣了,不是說不能實現,只是實現起來代價比較大,所以如果我們將其做成一個自定義的view,可以根據用戶傳進來的樣式去做倒計時樣式的展示(注:本文的代碼未做這些樣式的功能,但是基于本文代碼很容易實現這個功能),下面就一起看看我實現的倒計時自定義控件吧。
(注;本文代碼不可直接使用到項目中,如果需要使用到項目中,還需要對代碼做處理,比如固定時間到顯示寬度,不然顯示時間時會出現跳躍和顯示不全對情況,例如可以測量“00:00:00”的寬度設置個顯示的view,或者讀者可以自己選擇解決的辦法,還有顯示的時候是否需要去掉字體的內邊距,這個都需要讀者自己去決定,去掉內邊距也簡單,就是TextView的一個方法setIncludeFontPadding(false)就行了)
這個倒計時是精確到了毫秒,但也可以根據自己的需求去修改。很簡單將格式從“HH:MM:SS SSS ”改為“HH:MM:SS”就可以了
實現的思路其實很簡單,繼承自一個TextView,參照系統的倒計時控件做一個封裝就可以了。
首先初始化需要倒計時的時間:
public void init(long timeInFuture, long timeInterval){ mTimeInFuture = timeInFuture; mTimeInterval = timeInterval; mStopTimeInFuture = SystemClock.elapsedRealtime() + mTimeInFuture; updateText(mStopTimeInFuture); }
timeInFuture 表示你要倒計時的一個時間長度,比如說10秒,3天,5天等,timeInterval表示時間間隔,即每次倒計時遞減多少時間,可以是1秒,2秒,3秒…,elapsedRealtime表示獲取從設備boot后經歷的時間值,通過他加上我們的時間長度,就可以準備開始倒計時了。
public void start() { mStarted = true; updateTimer(); }
當用戶調用start()函數時,會調用updateTimer()函數,這個函數會執行倒計時的邏輯:
private void updateTimer() { boolean running = mVisible && mStarted && isShown(); if(running != mRunning){ if(running) { doCountDownTimer(); }else{ removeCallbacks(mTickRunnable); } mRunning = running; } }
從代碼中可知,只有控件可見并且時mStarted的情況下才會去做倒計時。倒計時的執行函數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); } }
代碼很容易看懂,這個地方需要特別說明的是,咱們的倒計時利用了view的postDelayed方法,lastUpdateTextDuration這個變量值記錄了上一次更新倒計時text所耗費的時間,把這個時間考慮上會讓倒計時更加精確,因為在demo為了演示的需要所以加了兩個按鈕,在秒殺時,這個時間的精確性還是有要求的,如果差異太大的話會影響用戶體驗。
文章開頭說可以讓時間顯示各種樣式,其實就是把時間中的每個字符分離出來,這樣就能單獨的定義樣式了:
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]; }
需要加樣式就設計好樣式后把分割好的字符填到樣式中就可以了!
以上就是關于“Android如何實現一個倒計時自定義控件”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。