「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」
当不满足官方的ProgressIndicator
的时候,作为一名优秀的安卓开发者,肯canvas绘图定要自定义一个啦

自定义Progresscanvas什么意思Indicator
compose的Canvasandroid是什么系统提供了丰富的Api足以满足我们打造各种炫酷效果,我们只管发挥想象力,之前我有写过用Compose画太阳和月亮,感兴趣的可以去我的文章里面看。
传统写法Android自定义加载进度条+自定义Dialog简洁弹窗 – ()
首先用Canvandroid平板电脑价格as的drawLicanvas在线平面设计ne简单画一条直线
Canvas(modifier.padding(16.dp).fillMaxWidth()) { val canvasWidth = size.width // 画布的宽 val canvasHeight = size.height // 画布的高 drawLine( color = Color.Green, start = Offset(0f, 0f), end = Offset(canvasWidth, 0f), strokeWidth = 40f ) }

用StrokeCap设置成圆角
cap = StrokeCap.Round
这绿太刺眼换一个

接着传canvas可画官网值让它动起来
定义一个接收参数value
的范围 0~100
那么进度条的宽度就是画布的总宽度 (value/100)
@Composable private fun progressbar(modifier: Modifier = Modifier, value: Float) { Canvas(modifier.padding(16.dp).fillMaxWidth()) { val canvasWidth = size.width // 画布的宽 val canvasHeight = size.height // 画布的高 drawLine( color = Color.Cyan, start = Offset(0f, 0f), end = Offset(canvasWidth*(value/100), 0f), strokeWidth = 40f , cap = StrokeCap.Round ) } }
使用-模拟传值
var progressValue by remember { mutableStateOf(0F) } for (i in 1..100) { progressValue = i.toFloat() } progressbar(value = progressValue)
不对呀,这太快看不清了呀,canvas英语那怎么办呢?
好办用delay()延迟一下
compose中使用携程就用到LaunchedEffect
接着把for循环放到launch里面。因为delay()是个挂起函数
var progressValue by remember { mutableStateOf(0F) } LaunchedEffect(rememberScaffoldState()) { for (i in 1..100) { delay(30) progressValue = i.toFloat() } } progressbar(value = progressValue)
大致效果出来了继续优化
加个进度文本
Column() { Canvas(modifier.fillMaxWidth().padding(16.dp)) { ... } Row { Spacer(Modifier.weight(1f)) Text("$value%",modifier.padding(end =16.dp)) } }
裁剪时手抖了一下所以边缘略微闪烁
完整代码
@Composable private fun progressbar(modifier: Modifier = Modifier, value: Float) { val color = Brush.verticalGradient( listOf( CustomTheme.colors.statusBarColor, CustomTheme.colors.background ) ) Column() { Canvas(modifier.fillMaxWidth().padding(16.dp)) { val canvasWidth = size.width // 画布的宽 val canvasHeight = size.height // 画布的高 drawLine( color = Color.Cyan, start = Offset(0f, 0f), end = Offset(canvasWidth*(value/100), 0f), strokeWidth = 40f , cap = StrokeCap.Round ) } Row { Spacer(Modifier.weight(1f)) Text("$value%",modifier.padding(end =16.dp)) } } }
把进度条换成渐变色
这个android手机就要用到Path和drawPath了
完整代码
@Composable private fun progressbar(modifier: Modifier = Modifier, value: Float) { Column() { Canvas(modifier.fillMaxWidth().padding(16.dp)) { val canvasWidth = size.width // 画布的宽 val canvasHeight = size.height // 画布的高 val strokeWidth = canvasHeight / 20 val path = Path() path.lineTo(canvasWidth*(value/100), 0f) drawPath( path = path, style = Stroke( width = strokeWidth, cap = StrokeCap.Round ), brush = Brush.horizontalGradient( colors = listOf( Color.Transparent, Color.Cyan ) ) ) } Row { Spacer(Modifier.weight(1f)) Text("$value%",modifier.padding(end =16.dp)) } } }
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)