我有一个Pomodoro应用程序,并想使用这个圆形.该形状会随时间值而变化.外面的圆点并不重要,我希望在我的应用程序上有一个内部和圆形的形状.我使用了Jetpack Compose和DrawArc和Canvas,但无法实现.

我想要这样的东西:

circle design

以下是我的代码:

Canvas(modifier.offset(y = 10.dp)) {
    drawArc(
        color = inactiveBarColor,
        startAngle = 90f,      
        sweepAngle = 90f,       
        useCenter = false,
        size = Size(size.width.toFloat(), size.height.toFloat()),
        style = Stroke(strokeWidth.toPx(), cap = StrokeCap.Round)
   )
   drawArc(
        color = activeBarColor,
        startAngle = 0f,      
        sweepAngle = 90f,
        useCenter = false,
        size = Size(size.width.toFloat(), size.height.toFloat()),
        style = Stroke(strokeWidth.toPx(), cap = StrokeCap.Round)
   )
}

Angular 的值是随机的,仅用于演示

推荐答案

你可以这样画.通过更改值,您可以构建精确的时钟形状.并且您需要在代码中将扫描Angular 从时间转换为Angular .

enter image description here

 @Preview
@Composable
private fun ClockArcSample() {
    Column {

        var sweepAngle by remember {
            mutableStateOf(90f)
        }

        Canvas(
            modifier = Modifier
                .fillMaxWidth()
                .background(Color.Red)
                .aspectRatio(1f)
        ) {
            val canvasWidth = size.width
            val arcDiameter = canvasWidth * .55f

            drawCircle(
                color = Color.White,
                style = Stroke(canvasWidth * 0.04f),
                radius = canvasWidth * .35f
            )

            drawArc(
                color = Color.White,
                270f,
                sweepAngle,
                true,
                topLeft = Offset((canvasWidth - arcDiameter) / 2, (canvasWidth - arcDiameter) / 2),
                size = Size(arcDiameter, arcDiameter)
            )

            val strokeWidth = 2.dp.toPx()
            for (i in 0..360 step 6) {
                rotate(i.toFloat()) {
                    drawLine(
                        color = Color.White,
                        strokeWidth = strokeWidth,
                        start = Offset(
                            x = canvasWidth * 0.90f,
                            y = center.y
                        ),
                        end = Offset(
                            x = canvasWidth * 0.93f,
                            y = center.y
                        ),
                        cap = StrokeCap.Round
                    )
                }
            }
        }

        Slider(
            value = sweepAngle,
            onValueChange = { sweepAngle = it },
            valueRange = 0f..360f
        )
    }
}

Android相关问答推荐

为什么使用. DeliverveAsState()时会出现空指针异常?

Jetpack Compose make父级图像填充高度

如何完全隐藏的元素堆叠在CardView?

如何在Jetpack composeH中创建具有弯曲末端的六边形形状

在Android Studio中,如何在BuildSrc Dependenices Kotlin文件中指定时标记与旧版本的依赖关系

为什么Kotlin允许将非空值类型化为可空类型,但又将其视为非空值?

我无法在底部导航栏中正确导航-Android底部导航视图

从 Jetpack Compose 中的图像中删除默认高度

当我想使用例如 material3 时,为什么我需要添加对 material 的依赖?底部导航?

错误:无法安装应用程序:INSTALL_PARSE_FAILED_MANIFEST_MALFORMED (React-Native-Android-Studio)

如何在 Android Studio 中为带有 Room 的 SQLite 编写需要参数的查询?

如何在 Jetpack Compose 中将文本绘制在另一个对象的中心?

从 HiltViewModel @Injection 访问 Application()

在 compose android 中创建一个圆形按钮和居中文本

我该怎么做文本计时器

Composable 不会在单击按钮时重新组合

如何在 Jetpack Compose 中禁用 Horizo​​ntalPager 的分页动画

如何在 TextButton 中分隔文本和图标

如何在 Jetpack Compose 中禁用 TabRow 或 Tab 中的涟漪效应?

单击登录按钮后从应用程序中退出