Android倒計時控件實現

效果圖如下:

那麼如何實現這個倒計時功能?需要圍繞核心功能來延伸開發:

不論是全屏還是縮小,都需要選擇時間之後才能開始倒計時,那麼首先實現自定義滑動時間。

實現一個如此功能的自定義view,需要如下爲步驟:以選擇中的時間字體爲軸心,分上、下2部分時間,和上下滑動選擇時間,首先繪製時間顯示字體:

Paint.FontMetricsInt 繪製文本對象。fmi.top,fmi.bottom 獲取最高字符和最低字符到基準點的值。 因爲選擇和未選擇的時間需要大小亮度區分出來,所有上下方的時間需要另行繪製:

如此顯示時間繪製完畢,之後再定義隨手勢拖動來選擇時間,這裏需要定義 onTouch 事件:

  • MotionEvent.ACTION_DOWN:紀錄 y 座標

  • MotionEvent.ACTION_MOVE:根據先前手勢按下時的座標,再與移動時的座標對比來判斷是向上還是向下滑動

  • MotionEvent.ACTION_UP:

當擡手的時候紀錄當前選中時間,定義接口獲取時間。

完成自定義滑動時間後,可以來創建正常形態下的倒計時界面了,因爲要滿足所有環境下能使用倒計時,所以這裏 3個view 都是用 WindowManager 來創建懸浮窗:

接下來在創建 TimerStandardView 時需要設置滑動條的時間:

這裏設置的是一個小時的倒計時,足夠滿足大部分的需求,另外在這裏需要注意在縮小和全屏下切換回正常形態的倒計時,需要判斷是否計時結束切換回來:

Create view 之後當點擊開始倒計時之後,如果用戶不進行操作,這裏設計4秒之後自動切換至縮小形態,這裏使用 CountDownTimer 來倒計時執行。

CountDownTimer 的相關知識網上很多這裏就不再贅述。這麼設計之後,那麼問題來了,如果用戶拖動了這個懸浮窗,是不是這裏倒計時就不能再執行4秒切換,用戶不再拖動,又需要重新開始4秒倒計時,這裏可以使用 handle 來傳遞停止和開始的指令:

在用戶拖動懸浮窗改變位置後需要注意,如果切換形態是需要記錄相互位置的,以此來提高用戶體驗,比如在TV上如果不記錄位置還得重新點擊拖動,所以使用本地存儲來保存x,y的座標,在拖動懸浮窗時存儲位置:

在創建懸浮窗時再獲取位置:

以上基本就完成大部分的功能需求,然後就只剩下開始和暫停功能了:

倒計時計算非常簡單,這裏我就不再浪費時間了,具體可以看源碼,至於剩下的縮小和全屏倒計時界面基本是一樣的流程。另外需要注意的是如果是在TV和平板上是不會出現適配不佳的問題,要是用手機調試的話需要修改下 dimens。那麼到這裏這篇博客就告一段落了。第一次寫博客也不知道質量如何,歡迎大家拍磚,謝謝。代碼地址:

http://download.csdn.net/download/qq654115417/9854122

更多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章