当前位置: 首页 > news >正文

python适合大型网站开发吗百度浏览器在线打开

python适合大型网站开发吗,百度浏览器在线打开,wordpress如何多用户,什么网站能让小孩做算术题效果 倒计时View视频 背景 业务场景需要显示带有毫秒级别的倒计时,于是自己封装一个通用的倒计时组件 源码分析 核心倒计时逻辑,主要是每隔100毫秒计算一次从开始倒计时到现在的剩余时间,并通过process接口返回出去Handler每次设置100毫秒…

效果

倒计时View视频

背景

业务场景需要显示带有毫秒级别的倒计时,于是自己封装一个通用的倒计时组件

源码分析

  1. 核心倒计时逻辑,主要是每隔100毫秒计算一次从开始倒计时到现在的剩余时间,并通过process接口返回出去
  2. Handler每次设置100毫秒的延迟
  3. 将返回出来的时间解析出来
private fun formatTimeToView(remainTime: Long) {val lengthSec = remainTime / 1000val hours = lengthSec / 3600val rem = lengthSec % 3600val minutes = rem / 60val seconds = rem % 60val milliseconds = remainTime % 1000tvMill.text = String.format("%03d", milliseconds)tvHour.text = String.format("%02d", hours)tvMin.text = String.format("%02d", minutes)tvSecond.text = String.format("%02d", seconds)
}

完整源码

class MillCountdownView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null
) : LinearLayout(context, attrs) {private val root = LayoutInflater.from(context).inflate(R.layout.view_count_down, this, true)private val countDownTask: CountDownRunnableprivate val tvHour: TextViewprivate val tvMin: TextViewprivate val tvSecond: TextViewprivate val tvMill: TextViewinit {background = context.getDrawable(R.drawable.count_down_item_bg)orientation = HORIZONTALgravity = Gravity.CENTER_VERTICALtvHour = root.findViewById(R.id.tvHour)tvMin = root.findViewById(R.id.tvMin)tvSecond = root.findViewById(R.id.tvSecond)tvMill = root.findViewById(R.id.tvMill)countDownTask = CountDownRunnable(1).apply {listener = object : TaskListener {override fun finish() {tvHour.text = "00"tvMin.text = "00"tvSecond.text = "00"tvMill.text = "000"Toast.makeText(context, "倒计时结束", Toast.LENGTH_SHORT).show()}override fun process(remainTime: Long) {if (remainTime < 1) {tvHour.text = "00"tvMin.text = "00"tvSecond.text = "00"tvMill.text = "000"return}formatTimeToView(remainTime)}}}}private fun formatTimeToView(remainTime: Long) {val lengthSec = remainTime / 1000val hours = lengthSec / 3600val rem = lengthSec % 3600val minutes = rem / 60val seconds = rem % 60val milliseconds = remainTime % 1000tvMill.text = String.format("%03d", milliseconds)tvHour.text = String.format("%02d", hours)tvMin.text = String.format("%02d", minutes)tvSecond.text = String.format("%02d", seconds)}/*** 预先展示倒计时文本* @param remainTime 倒计时时间,单位毫秒*/fun preShowRemainSecs(remainTime: Long) {countDownTask.totalCountDownTime = remainTimeformatTimeToView(remainTime)}/*** 开始倒计时* @param remainTime 倒计时时间,单位毫秒*/fun startCountdown(remainTime: Long) {countDownTask.destroy()countDownTask.totalCountDownTime = remainTimecountDownTask.start()}fun destroyCountdown() {countDownTask.destroy()}
}
class CountDownRunnable(@IntRange(from = 1)var totalCountDownTime: Long) : Runnable {private val mHandler = Handler(Looper.getMainLooper())var listener: TaskListener? = nullprivate var startCountDownTime = 0L //开始时当前系统时间private var isTaskExecuting = falseoverride fun run() {if (!isTaskExecuting) {return}val dur = SystemClock.elapsedRealtime() - startCountDownTimeval remainTime = totalCountDownTime - durval mill = remainTime % 1000if (remainTime <= 0) {listener?.finish()isTaskExecuting = falsereturn} else {listener?.process(remainTime)}mHandler.postDelayed(this, 100)}fun start() {startCountDownTime = SystemClock.elapsedRealtime()mHandler.post(this)isTaskExecuting = true}fun resume() {val remainTime = totalCountDownTime - ((SystemClock.elapsedRealtime() - startCountDownTime) / 1000).toInt()if (remainTime <= 0) {listener?.finish()return}mHandler.removeCallbacks(this)isTaskExecuting = truemHandler.post(this)}fun pause() {isTaskExecuting = falsemHandler.removeCallbacks(this)}fun destroy() {isTaskExecuting = falsemHandler.removeCallbacks(this)}
}interface TaskListener {fun finish()fun process(remainTime: Long)
}
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:orientation="horizontal"tools:parentTag="LinearLayout"><androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/tvHour"android:layout_width="wrap_content"android:layout_height="wrap_content"android:minWidth="30dp"android:gravity="center"android:textColor="#000"android:textSize="25sp"android:textStyle="bold"android:layout_marginStart="10dp"android:layout_marginVertical="5dp"tools:text="1" /><androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/divider1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginHorizontal="4dp"android:gravity="center"android:text=":"android:textColor="#000"android:textSize="25sp"android:textStyle="bold" /><androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/tvMin"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="5dp"android:gravity="center"android:textColor="#000"android:minWidth="30dp"android:textSize="25sp"android:textStyle="bold"tools:text="8" /><androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/divider2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginHorizontal="4dp"android:gravity="center"android:text=":"android:textColor="#000"android:textSize="25sp"android:textStyle="bold" /><androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/tvSecond"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:textColor="#000"android:textSize="25sp"android:textStyle="bold"android:minWidth="30dp"tools:text="3" /><androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/divider3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginHorizontal="4dp"android:gravity="center"android:text=":"android:textColor="#000"android:textSize="25sp"android:textStyle="bold" /><androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/tvMill"android:layout_width="wrap_content"android:minWidth="49dp"android:layout_height="wrap_content"android:layout_marginStart="5dp"android:gravity="center"android:textColor="#a00"android:textSize="25sp"android:textStyle="bold"tools:text="000"android:layout_marginEnd="10dp"/></merge>
http://www.dinnco.com/news/4870.html

相关文章:

  • 做投票网站网站建设营销推广
  • 做地方门户网站怎样公司怎么建立自己的网站
  • 成都网站建设的公司哪家好h5网站制作平台
  • 一个专门做澳洲直邮的网站吗西安疫情最新情况
  • 买域名不建网站近期10大新闻事件
  • 重庆网站建设 快速建站宁波seo深度优化平台
  • 做海报有什么借鉴的网站深圳网站开发制作
  • 如东网站建设国外免费ip地址
  • 怎么让别人看到自己做的网站简述什么是网络营销
  • 二手车网站开发背景软文范文200字
  • 科技企业网站设计奉化云优化seo
  • 网站假设教程chrome 谷歌浏览器
  • 手机网站 普通网站中小企业网络推广
  • 程序员wordpressseo快速整站上排名教程
  • b2c网站提高订单转化率的方法优化推广关键词
  • 临夏做网站武汉seo招聘
  • 网站设计就业怎么样线上推广策划方案范文
  • 医学关键词 是哪个网站做农村电商平台有哪些
  • 罗湖网站建设费用优化教程网站推广排名
  • 做棋牌网站江苏seo平台
  • 网站开发费的会计处理怎么做好seo内容优化
  • 一家公司做网站需要什么资料超级优化大师
  • 一个电商网站开发要多久佛山网站建设正规公司
  • 做图网站有哪些东西宣传软文是什么
  • 盛世阳光-网站建设标题优化怎么做
  • 以企业介绍为主做外贸网站好吗常用的网络营销平台有哪些
  • 动漫设计就业率高吗广东seo推广方案
  • 2网站建设网站推广应该怎么做?
  • 湖口县建站公司百度app免费下载安装最新版
  • 网站开发黄色片苏州网站建设费用