android Chronometer控件使用大全
1、序言
Chronometer 是android 官方提供的計(jì)時器、可實(shí)現(xiàn)正/倒計(jì)時、格式固定:00:00:00;
2、使用
如圖xml

xml 簡化寫法如下:
<Chronometer
android:id="@+id/tvEndTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
3、發(fā)起倒計(jì)時
tvEndTime.run {
//格式化-> 距結(jié)束00:00:00
format = "距結(jié)束%s"
//設(shè)置倒計(jì)時時間 countDownTimeMill -》自定義 單位毫秒
base = countDownTimeMill + SystemClock.elapsedRealtime()
//是否為倒計(jì)時、
isCountDown = true
//倒計(jì)時監(jiān)聽 每隔一秒
setOnChronometerTickListener {
//倒計(jì)時結(jié)束
if (SystemClock.elapsedRealtime() - it.base >= 0) {
it.stop()
return@setOnChronometerTickListener
// TODO: 2021/9/16 處理業(yè)務(wù)邏輯
}
}
}
4、自定義格式化
tvEndTime.run {
//格式化-> 距結(jié)束00:00:00
format = "距結(jié)束%s"
//設(shè)置倒計(jì)時時間
base = countDownTimeMill + SystemClock.elapsedRealtime()
//是否為倒計(jì)時、
isCountDown = true
//倒計(jì)時監(jiān)聽 每隔一秒
setOnChronometerTickListener {
//倒計(jì)時結(jié)束
if (SystemClock.elapsedRealtime() - it.base >= 0) {
it.stop()
return@setOnChronometerTickListener
//自定義日期格式 如 1天 23:02:56
it.text = TimeUtils.formatSecondByMill(86400 * 1000)
}
}
}
工具類:
object TimeUtils {
/**
* 發(fā)送消息日期格式
*
* @param msgTimeMillis
* @return
*/
fun getMsgFormatTime(msgTimeMillis: Long): String? {
val nowTime = Date()
val msgTime = Date(msgTimeMillis)
val days = differentDays(msgTime, nowTime)
// 早上、下午、晚上 1:40
val hourOfDay = DateUtils.getHour(msgTime)
val whens: String = when {
hourOfDay >= 18 -> { //18-24
"晚上"
}
hourOfDay >= 13 -> { //13-18
"下午"
}
hourOfDay >= 11 -> { //11-13
"中午"
}
hourOfDay >= 5 -> { //5-11
"早上"
}
else -> { //0-5
"凌晨"
}
}
return if (days < 1) {
whens + " " + DateUtils.format(msgTime, "HH:mm")
} else {
// 昨天
// return DateUtils.format(new Date(msgTimeMillis), "yyyy年MM月dd日 ") + when + DateUtils.format(new Date(msgTimeMillis), " HH:mm");
DateUtils.format(Date(msgTimeMillis), "yyyy年MM月dd日 ")
}
}
/**
* date2比date1多的天數(shù)
* @param date1
* @param date2
* @return
*/
private fun differentDays(msgTime: Date, nowTime: Date): Int {
val cal1 = Calendar.getInstance()
cal1.time = msgTime
val cal2 = Calendar.getInstance()
cal2.time = nowTime
val day1 = cal1[Calendar.DAY_OF_YEAR]
val day2 = cal2[Calendar.DAY_OF_YEAR]
val year1 = cal1[Calendar.YEAR]
val year2 = cal2[Calendar.YEAR]
return if (year1 != year2) //同一年
{
var timeDistance = 0
for (i in year1 until year2) {
timeDistance += if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) //閏年
{
366
} else //不是閏年
{
365
}
}
timeDistance + (day2 - day1)
} else //不同年
{
day2 - day1
}
}
/**
* 格式化秒數(shù)
* des:%02d 長度不夠2位的時前面補(bǔ)0
*/
fun formatSeconds(seconds: Long): String? {
return when {
seconds <= 0 -> {
"00:00"
}
seconds < 60 -> {
String.format(Locale.getDefault(), "00:%02d", seconds % 60)
}
seconds < 3600 -> {
String.format(Locale.getDefault(), "%02d:%02d", seconds / 60, seconds % 60)
}
else -> {
String.format(
Locale.getDefault(),
"%02d:%02d:%02d",
seconds / 3600,
seconds % 3600 / 60,
seconds % 60
)
}
}
}
fun formatSecond(seconds: Long): String? {
return when {
seconds <= 0 -> {
"0分"
}
seconds < 60 -> {
String.format(Locale.getDefault(), "%02d秒", seconds % 60)
}
seconds < 3600 -> {
String.format(Locale.getDefault(), "%02d分%02d秒", seconds / 60, seconds % 60)
}
else -> {
String.format(
Locale.getDefault(),
"%02d時%02d分",
seconds / 3600,
seconds % 3600 / 60,
)
}
}
}
/**
* 格式化日期 eg 天 時:分:秒 00:00:00
* @param dayUnit 單位 默認(rèn)不寫
*/
fun formatSecondByMill(millTime: Long, dayUnit: String = "天"): String? {
//小于一天、單位毫秒
return if (millTime <= 86400 * 1000) {
formatSeconds(millTime / 1000)
} else {
val oneDayMill = 86400 * 1000
val day = millTime / oneDayMill
val lastOneDayMills = millTime - day * oneDayMill
"$day$dayUnit ${formatSeconds(lastOneDayMills / 1000)}"
}
}
}
注意:別再format上做文章、因?yàn)闆]用?。?!
到此這篇關(guān)于android Chronometer控件簡單使用的文章就介紹到這了,更多相關(guān)android Chronometer控件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android開發(fā)之無痕過渡下拉刷新控件的實(shí)現(xiàn)思路詳解
下拉刷新效果功能在程序開發(fā)中經(jīng)常會見到,今天小編抽時間給大家分享Android開發(fā)之無痕過渡下拉刷新控件的實(shí)現(xiàn)思路詳解,需要的朋友參考下吧2016-11-11
Android基于ListView實(shí)現(xiàn)類似QQ空間的滾動翻頁與滾動加載效果
這篇文章主要介紹了Android基于ListView實(shí)現(xiàn)類似QQ空間的滾動翻頁與滾動加載效果,涉及ListView相關(guān)屬性與方法的操作技巧,需要的朋友可以參考下2016-08-08
Android應(yīng)用中內(nèi)嵌SQLite數(shù)據(jù)庫的基本操作指南
這篇文章主要介紹了Android應(yīng)用中內(nèi)嵌SQLite數(shù)據(jù)庫的基本操作指南,包括創(chuàng)建DAO類接口以及相關(guān)的增刪查改等操作的明說,需要的朋友可以參考下2016-02-02
詳解Android開啟OTG功能/USB?Host?API功能
這篇文章主要介紹了Android開啟OTG功能/USB?Host?API功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
Android ContentProvider基礎(chǔ)應(yīng)用詳解
ContentProvider是android四大組件之一。它是不同應(yīng)用程序之間交換數(shù)據(jù)的標(biāo)準(zhǔn)api,ContentProvider以某種uri的形式對外提供數(shù)據(jù),允許其它應(yīng)用程序?qū)ζ湓L問或者修改數(shù)據(jù)。本文將介紹ContentProvider的基礎(chǔ)應(yīng)用,感興趣的可以學(xué)習(xí)一下2021-12-12
Android中RecyclerView實(shí)現(xiàn)商品分類功能
這篇文章主要為大家詳細(xì)介紹了Android中RecyclerView實(shí)現(xiàn)商品分類功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
Android-實(shí)現(xiàn)切換Fragment頁功能的實(shí)現(xiàn)代碼
本篇文章主要介紹了Android-實(shí)現(xiàn)切換Fragment頁功能的實(shí)現(xiàn)代碼,具有一定的參加價值,有興趣的可以了解一下。2017-02-02
Android 版本、權(quán)限適配相關(guān)總結(jié)
針對 Android 6.0 (API 23)已以上版本,Google 增強(qiáng)全新的權(quán)限,應(yīng)用程序在使用敏感權(quán)限(如拍照、查閱聯(lián)系人或存儲)時需要先征求用戶必須贏得用戶同意。2021-05-05

