自定义倒计时弹框,升级版,三个方法

效果图

一个示例

主要的实现方法

在这篇文章中,你将学会

  1. 如何使用Handler进行倒计时
  2. 如何使用CountDownTimer进行倒计时
  3. 如何使用RxJava的internal实现倒计时
  4. 最后举个倒计时弹框的栗子,活学活用,mozhimen~

  • Handler来实现
private var countDownTime = 10
private var countDownHandler = Handler(Looper.getMainLooper())
private val countDown = object : Runnable {override fun run() {if (countDownTime >= 0) {countDownHandler.postDelayed(this, 1000)//每秒//执行UI更新逻辑//textCountDown.text = "${countDownTime}s"} else {//停止的逻辑countDownHandler.removeCallbacksAndMessages(null)//countDownDialog.dismiss()}countDownTime--}
}//调用
countDownTime = 10
countDownHandler.postDelayed(countDown, 0)
  • CountDownTimer实现
private var countDownTime = 10
private val countDownTimer: CountDownTimer = object : CountDownTimer(countDownTime.toLong() * 1000, 1000) {@SuppressLint("SetTextI18n")override fun onTick(millisUntilFinished: Long) {//执行UI更新逻辑//textCountDown.text = "${millisUntilFinished / 1000}s"}override fun onFinish() {//停止的逻辑//countDownDialog.dismiss()}
}//调用
countDownTimer.start()
  • RxJava实现
private var countDownTime = 10
private val disposables = CompositeDisposable()
disposables.add(Flowable.intervalRange(0, countDownTime , 0, 1, TimeUnit.SECONDS).observeOn(Schedulers.io()).doOnNext {//执行UI更新逻辑//textCountDown.text = "${countDownTime-1}s"}.doOnComplete {//停止的逻辑//countDownDialog.dismiss()countDownTime = 10}.subscribe())

结合所学,我们来实现一下

kotlin

class CountDownOrderDialog : Dialog {constructor(context: Context?) : super(context!!)constructor(context: Context?, theme: Int) : super(context!!, theme)interface IGetExitActionCallback {fun setExitAction()}enum class OrderResult(val value: String) {SUCCESS("微信扫码参会人员邀请"),FAIL("预约失败")}class Builder(private val context: Context) {private lateinit var countDownDialog: CountDownOrderDialogprivate var countDownTime = 10private var countDownHandler = Handler(Looper.getMainLooper())private val countDown = object : Runnable {override fun run() {if (countDownTime >= 0) {countDownHandler.postDelayed(this, 1000)//每秒//执行UI更新逻辑textCountDown.text = "${countDownTime}s"} else {//停止的逻辑countDownHandler.removeCallbacksAndMessages(null)iGetExitActionCallback?.setExitAction()countDownDialog.dismiss()}countDownTime--}}private var orderResult: OrderResult? = nullprivate var mTheme: String? = nullprivate var mName: String? = nullprivate var mTime: String? = nullprivate var mQRImage: Drawable? = nullprivate var positiveButtonClickListener: DialogInterface.OnClickListener? = nullprivate var iGetExitActionCallback: IGetExitActionCallback? = null//设置属性fun setOrderResult(orderResult: OrderResult): Builder {this.orderResult = orderResultreturn this}//设置会议室文本fun setName(name: String): Builder {this.mName = namereturn this}//设置主题fun setTheme(theme: String): Builder {this.mTheme = themereturn this}//设置时间fun setTime(time: String): Builder {this.mTime = timereturn this}//设置二维码图标fun setQRImage(qrImage: Drawable): Builder {this.mQRImage = qrImagereturn this}//设置退出点击事件fun setPositiveButton(listener: DialogInterface.OnClickListener): Builder {this.positiveButtonClickListener = listenerreturn this}fun setExitAction(iGetExitActionCallback: IGetExitActionCallback): Builder {this.iGetExitActionCallback = iGetExitActionCallbackreturn this}private lateinit var textCountDown: TextViewprivate lateinit var dialogPane1: FrameLayoutprivate lateinit var dialogPane2: LinearLayoutprivate lateinit var dialogPane3: LinearLayoutprivate lateinit var dialogFail: TextViewprivate lateinit var dialogTitle: TextViewprivate lateinit var dialogTheme: TextViewprivate lateinit var dialogName: TextViewprivate lateinit var dialogTime: TextViewprivate lateinit var dialogQr: ImageViewfun create(): CountDownOrderDialog {val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater//为自定义弹框设置主题countDownDialog = CountDownOrderDialog(context, R.style.CustomDialog)val view = layoutInflater.inflate(R.layout.dialog_champer_order, null)countDownDialog.addContentView(view, LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT))//设置倒计时textCountDown = view.findViewById(R.id.dialog_champer_countdown)textCountDown.text = "10s"dialogPane1 = view.findViewById(R.id.dialog_champer_order_pane1)dialogPane2 = view.findViewById(R.id.dialog_champer_order_pane2)dialogPane3 = view.findViewById(R.id.dialog_champer_order_pane3)dialogFail = view.findViewById(R.id.dialog_champer_order_fail)dialogTitle = view.findViewById(R.id.dialog_champer_order_title)dialogTheme = view.findViewById(R.id.dialog_champer_order_theme)dialogName = view.findViewById(R.id.dialog_champer_order_name)dialogTime = view.findViewById(R.id.dialog_champer_order_time)dialogQr = view.findViewById(R.id.dialog_champer_order_qr)orderResult?.let {setPaneStyle(it)} ?: kotlin.run {setPaneStyle(OrderResult.FAIL)}//设置弹框按钮positiveButtonClickListener?.let {(view.findViewById(R.id.dialog_champer_order_close) as Button).setOnClickListener {countDownHandler.removeCallbacksAndMessages(null)positiveButtonClickListener!!.onClick(countDownDialog, DialogInterface.BUTTON_POSITIVE)iGetExitActionCallback?.setExitAction()}} ?: run {(view.findViewById(R.id.dialog_champer_order_close) as Button).visibility = View.GONE}countDownDialog.setContentView(view)countDownTime = 10countDownHandler.postDelayed(countDown, 0)return countDownDialog}private fun setPaneStyle(orderResult: OrderResult) {when (orderResult) {OrderResult.SUCCESS -> {dialogPane1.visibility = View.VISIBLEdialogPane2.visibility = View.VISIBLEdialogPane3.visibility = View.VISIBLEdialogFail.visibility = View.GONE//设置标题dialogTitle.text = orderResult.value//设置名称mName?.let {dialogName.text = it}//设置主题mTheme?.let {dialogTheme.text = it}//设置时间mTime?.let {dialogTime.text = it}//设置二维码图标mQRImage?.let {dialogQr.setImageDrawable(it)dialogQr.visibility = View.VISIBLE} ?: kotlin.run {dialogQr.visibility = View.GONEdialogQr.visibility = View.GONE}}else -> {dialogPane1.visibility = View.GONEdialogPane2.visibility = View.GONEdialogPane3.visibility = View.GONEdialogFail.visibility = View.VISIBLEdialogFail.text=orderResult.value}}}}
}

如何调用

val builder = CountDownOrderDialog.Builder(this)
builder.apply {setOrderResult(CountDownOrderDialog.OrderResult.SUCCESS)setTheme("技术选型会")setName("赵的会议")setTime("08:00-09:00")setPositiveButton(DialogInterface.OnClickListener { dialog, _ ->dialog.dismiss()})setExitAction(object : CountDownOrderDialog.IGetExitActionCallback {override fun setExitAction() {//新增回调功能,执行倒计时退出后的逻辑}})
}

上文只是通过Handler的方式来实现,接下来用这个例子试试刚才学习的成果,其他的方法就交给你啦

【Android】自定义倒计时弹框(Handler/Timer/RxJava/持续更新)相关推荐

  1. Android自定义Dialog弹框效果

    这是弹框输入密码的,这里还有一个是我发现一个博友写的自定义Dialog弹框信息和背景阴影显示 ,两者结合一起看,最好了!!! 下面是弹框输入密码的!!! 首先需要自定义一个类,继承Dialog pac ...

  2. android的底部弹出框炫酷的样式,Android自定义底部弹出框ButtomDialog

    本文实例为大家分享了Android自定义底部弹出框的具体代码,供大家参考,具体内容如下 先看看效果和你要的是否一样 一 .先来配置自定义控件需要的资源 1.在res文件夹下创建一个anim文件夹并创建 ...

  3. Android 简易的自定义确认弹框AlertDialog

    使用方式/构造函数参数解释: 参数一:上下文; 参数二:标题; 参数三:内容; 参数四:确认按钮点击回调 CustomDialog(this, "清空输入", "确定要清 ...

  4. Android之底部弹框

    文章链接: Android之底部弹窗 知识点: 1.dialog的简单使用: 2.自定义底部弹框: 3.新名词记录 { 5.0 转场动画 } 底部弹框:就是从手机屏幕底边位置弹出来,最常见的就是弹框里 ...

  5. 微信小程序自定义授权弹框

    微信小程序自定义授权弹框 最近微信获取用户信息的接口有调整,就是这货:wx.getUserInfo(OBJECT),文档描述如下: 此接口有调整,使用该接口将不再出现授权弹窗,请使用 <butt ...

  6. android仿ios弹框_在“提示”框中:iOS外观(在Android上运行),Google Maps作为Time Machine,下载Wii游戏保存...

    android仿ios弹框 Once a week we round up some great reader tips and share them with everyone. Read on t ...

  7. Android自定义底部弹出窗-dialog(2种实现分析+源码)

    Android自定义底部弹出窗-dialog(2种实现分析+源码) 上线项目功能抽取,在项目开发中,我们会在许多地方会用到底部自定义弹窗,比如设置:个人账户退出,切换,照片的拍照或者相册的调出,或者一 ...

  8. elementUI table自定义表头弹框搜索,排序,显示tag标签

    elementUI table自定义表头弹框搜索,排序,显示tag标签 允许一种排序,多种搜索条件 包括三种类别,添加了solt插槽,也可以自定义: 输入框[input] 多选[checkbox] 范 ...

  9. Android 高仿App项目归纳整理,持续更新中…

    Android 高仿App项目归纳整理,持续更新中- Android高仿App项目整理,包含高仿了一些大公司的app,有基于Java,Kotlin,Flutter等语言的.对于开发我们自已的项目时可以 ...

  10. Android 几种弹框样式 自定义Dialog PopupWindow的使用

    1.弹框的波浪线是动态的 和小度弹框样式相似 用到PopWindow 和自定义View . 2.这个弹框是动态的 用于网络加载时候  用到自定义Dialog 3.这就是一简单通用的弹框样式 第一种弹框 ...

最新文章

  1. BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)
  2. UVA 1331 Minimax Triangulation DP, 三角剖分
  3. (转载)把syslog接收的远程日志从/var/log/messages中分开
  4. AMD CPU真烂!售后服务也很可恶!
  5. VTK:可视化之Lorenz
  6. fast.ai_使用fast.ai自组织地图—步骤4:使用Fast.ai DataBunch处理非监督数据
  7. Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令
  8. java中的de是什么_【转】java中main函数解析
  9. 【布莱克智讯之声公众号】 精彩图文分类导航
  10. 详解CorelDRAW中如何合并与拆分对象
  11. linux彻底删除nginx
  12. pip 安装mmcv
  13. python从入门到实践答案第十章_Python编程:从入门到实践——【作业】——第十章(文件和异常)...
  14. java密码验证代码_java用户名密码验证示例代码分享
  15. Windows Server 2003 安装教程
  16. python中数据结构的基本定义
  17. Java 读取Excel ( xls 和 xlsx 格式 )
  18. 又一琼,又一琼......
  19. python并行编程 - GPU篇
  20. 终于搞定微信小程序canvas分享海报

热门文章

  1. 怎么在服务器上搭建网站(搭建服务器需要什么)
  2. 使用gsds绘制基因结构图_GSDS 基因结构显示系统
  3. 网站建设对企业的好处有哪些?
  4. 两台计算机传输文件速度,两台电脑间如何快速传输几百个G的文件?使用这2个方法,方便极了...
  5. c#winform单表生树
  6. linux7怎么关闭更新,如何让centos7关闭yum自动更新系统
  7. 抖音搬运新技术秒上热门,爆抖神器,效果惊人
  8. GitHub上十大热门Python项目
  9. Unity第一视角流血受伤受攻击屏幕流血效果
  10. blos硬盘启动台式计算机,最新戴尔台式机bios设置硬盘启动图解