Compose Weekly #2:Countdown Timer

本文同步发表于我的微信公众号,在微信搜索 OpenCV or Android 即可关注。

前言

最近Android官方发起了Jetpack Compose的推广活动:Jetpack Compose开发者挑战赛。活动时间一个月,每周一题,广大开发者根据官方需求,Clone官方模板工程并使用Jetpack Compose技术结题后按要求提交,即可参与活动。今天抽空完成了第二题,有点丑陋,感兴趣的同学可以做个漂亮点的。

环境

第二周

题目:Countdown Timer

要求:创建一个有效的单屏倒数计时器。

知识点:

思路

简单的计时器操作:设置计时时长,开始计时,等待计时结束或者手动暂停计时。

  • 界面元素:(1)倒计时进度条;(2)时分秒设置计时长度;(3)重置计时按钮、开始计时按钮
  • 可变状态:(1)时长(时分秒);(2)倒计时进度与总时长;(3)计时状态(是否已开始)

倒计时进度条

@Composable fun counterDown(modifier: Modifier, seconds: Int) { ConstraintLayout( modifier = modifier .fillMaxWidth() .fillMaxHeight() ) { val viewModel: MainViewModel = viewModel() val (progressBackground, progress, countdownTimer) = createRefs() CircularProgressIndicator( 1f, modifier = Modifier .constrainAs(progressBackground) { top.linkTo(parent.top) start.linkTo(parent.start) end.linkTo(parent.end) bottom.linkTo(parent.bottom) } .height(300.dp) .width(300.dp), strokeWidth = 32.dp, color = Color.LightGray ) Progress( Modifier .constrainAs(progress) { top.linkTo(parent.top) start.linkTo(parent.start) end.linkTo(parent.end) bottom.linkTo(parent.bottom) } .height(300.dp) .width(300.dp), countdownSeconds = viewModel.clock, totalSeconds = viewModel.totalClock ) Row( modifier = Modifier .fillMaxWidth() .constrainAs(countdownTimer) { top.linkTo(parent.top) start.linkTo(parent.start) end.linkTo(parent.end) bottom.linkTo(parent.bottom) }, horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically ) { Text( text = seconds.div(3600).toString(), fontSize = 48.sp, fontFamily = FontFamily.Monospace, fontStyle = FontStyle.Normal, fontWeight = FontWeight.Bold ) Text( text = ":", fontSize = 48.sp, fontFamily = FontFamily.Monospace, fontStyle = FontStyle.Normal, fontWeight = FontWeight.Bold ) Text( text = seconds.rem(3600).div(60).toString(), fontSize = 48.sp, fontFamily = FontFamily.Monospace, fontStyle = FontStyle.Normal, fontWeight = FontWeight.Bold ) Text( text = ":", fontSize = 48.sp, fontFamily = FontFamily.Monospace, fontStyle = FontStyle.Normal, fontWeight = FontWeight.Bold ) Text( text = seconds.rem(60).toString(), fontSize = 48.sp, fontFamily = FontFamily.Monospace, fontStyle = FontStyle.Normal, fontWeight = FontWeight.Bold ) } } }

设置时长

@Composable fun timePicker(modifier: Modifier) { val viewModel: MainViewModel = viewModel() Row( modifier = modifier .fillMaxWidth(), horizontalArrangement = Arrangement.SpaceAround ) { Column( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { IconButton( onClick = { viewModel.incHour() }, Modifier .background( Color.LightGray, shape = shapes.large ) .size(32.dp, 32.dp), ) { Icon( painter = painterResource(id = R.drawable.ic_inc), contentDescription = null, modifier = Modifier .size(18.dp), tint = Color.Black ) } Text( text = viewModel.hours.toString(), fontSize = 32.sp, fontFamily = FontFamily.Serif, fontStyle = FontStyle.Normal, fontWeight = FontWeight.Bold, modifier = Modifier.padding(0.dp, 8.dp) ) IconButton( onClick = { viewModel.decHour() }, Modifier .background( Color.LightGray, shape = shapes.large ) .size(32.dp, 32.dp), ) { Icon( painter = painterResource(id = R.drawable.ic_dec), contentDescription = null, modifier = Modifier .size(18.dp), tint = Color.Black ) } } Column( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { IconButton( onClick = { viewModel.incMinute() }, Modifier .background( Color.LightGray, shape = shapes.large ) .size(32.dp, 32.dp), ) { Icon( painter = painterResource(id = R.drawable.ic_inc), contentDescription = null, modifier = Modifier .size(18.dp), tint = Color.Black ) } Text( text = viewModel.minutes.toString(), fontSize = 32.sp, fontFamily = FontFamily.Serif, fontStyle = FontStyle.Normal, fontWeight = FontWeight.Bold, modifier = Modifier.padding(0.dp, 8.dp) ) IconButton( onClick = { viewModel.decMinute() }, Modifier .background( Color.LightGray, shape = shapes.large ) .size(32.dp, 32.dp), ) { Icon( painter = painterResource(id = R.drawable.ic_dec), contentDescription = null, modifier = Modifier .size(18.dp), tint = Color.Black ) } } Column( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { IconButton( onClick = { viewModel.incSecond() }, Modifier .background( Color.LightGray, shape = shapes.large ) .size(32.dp, 32.dp), ) { Icon( painter = painterResource(id = R.drawable.ic_inc), contentDescription = null, modifier = Modifier .size(18.dp), tint = Color.Black ) } Text( text = viewModel.seconds.toString(), fontSize = 32.sp, fontFamily = FontFamily.Serif, fontStyle = FontStyle.Normal, fontWeight = FontWeight.Bold, modifier = Modifier.padding(0.dp, 8.dp) ) IconButton( onClick = { viewModel.decSecond() }, Modifier .background( Color.LightGray, shape = shapes.large ) .size(32.dp, 32.dp), ) { Icon( painter = painterResource(id = R.drawable.ic_dec), contentDescription = null, modifier = Modifier .size(18.dp), tint = Color.Black ) } } } }

重置计时、开始计时

@Composable fun bottomMenu(modifier: Modifier) { val viewModel: MainViewModel = viewModel() Row( modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly, verticalAlignment = Alignment.CenterVertically ) { IconButton(onClick = { viewModel.reset() }) { Icon( painter = painterResource(id = R.drawable.ic_reset), contentDescription = null, modifier = Modifier .size(32.dp), tint = Color.Black ) } if (!viewModel.started) { IconButton(onClick = { viewModel.startCountdown() }) { Icon( painter = painterResource(id = R.drawable.ic_start), contentDescription = null, modifier = Modifier .size(32.dp), tint = Color.Black ) } } } }

效果

设置时长

倒计时

源码

https://github.com/onlyloveyd/Jetpack-Compose-CountdownTimer

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Compose Weekly #1: 小狗领养应用

本文同步发表于我的微信公众号,在微信搜索OpenCVorAndroid即可关注。前言最近Android官方发起了JetpackCompose的推广活动:JetpackCompose开发者挑战赛。活动时间一个月,每周一题,广大开发者根据官方需求,Clone官方模板工程并使用JetpackCompose技术结题后按要求提交,即可参与活动。