Timer Image Reference

我已经在图像中突出显示(红色)了我的问题;我想要设置蓝色指示器三角形的动画.

三角形在移动,但它没有正确移动.我不知道我错过了什么.

Timer Image with what I have achieved so far: Timer Image with what I have achieved so far

到目前为止,这是我的代码.

        val center = Offset(size.width / 2f, size.height / 2f)
        val beta = (250f * value + 145f) * (PI / 180f).toFloat()
        val r = size.width / 2f
        val a = cos(beta) * r
        val b = sin(beta) * r
        drawPoints(
            listOf(Offset(center.x + a, center.y + b)),
            pointMode = PointMode.Points,
            color = Color.Gray,
            strokeWidth = (strokeWidth * 2.2f).toPx(),
            cap = StrokeCap.Round
        )
        drawPoints(
            listOf(Offset(center.x + a, center.y + b)),
            pointMode = PointMode.Points,
            color = Color.White,
            strokeWidth = (strokeWidth * 2f).toPx(),
            cap = StrokeCap.Round
        )
        drawPoints(
            listOf(Offset(center.x + a, center.y + b)),
            pointMode = PointMode.Points,
            color = PrimaryBlueColor,
            strokeWidth = (strokeWidth * 1f).toPx(),
            cap = StrokeCap.Round
        )



        drawImage(
            image = vector,
            topLeft = Offset(center.x + a, center.y + b)
        )

推荐答案

作曲中的旋转非常简单.内部画布或实际DrawScope调用

rotate(value) {
  // Anything you draw here is rotate by angle in degrees
}

AS

val centerX = center.x
val centerY = center.y
val triangleWidthPx = triangleWidth.toPx()
val triangleHeightPx = triangleHeight.toPx()
val diff = offsetX.toPx()
val strokeWidthPx = strokeWidth.toPx()

val triangleStartX = centerX + radiusPx - diff

if (trianglePath.isEmpty) {
    trianglePath.apply {
        moveTo(triangleStartX, centerY - triangleHeightPx / 2)
        lineTo(triangleStartX + triangleWidthPx, centerY)
        lineTo(triangleStartX, centerY + +triangleHeightPx / 2)
        lineTo(triangleStartX, centerY - triangleHeightPx / 2)
    }
}


rotate(value) {
    drawPath(trianglePath, Color(0xff243f8d))
}

完整样品

游行示威

enter image description here

代码

@Composable
private fun CanvasRotationSample() {

    var value by remember {
        mutableStateOf(0f)
    }

    val diameter = 160.dp

    Spacer(modifier = Modifier.height(50.dp))
    Slider(value = value, onValueChange = { value = it }, valueRange = 0f..360f)
    Spacer(modifier = Modifier.height(50.dp))

    val trianglePath = remember {
        Path()
    }

    val triangleWidth = 24.dp
    val triangleHeight = 24.dp
    val offsetX = 2.dp
    Box(
        Modifier
            .fillMaxWidth()
            .aspectRatio(1f),
        contentAlignment = Alignment.Center
    ) {
        Canvas(
            modifier = Modifier.matchParentSize()
        ) {

            val radius = diameter.toPx() / 2
            val centerX = center.x
            val centerY = center.y
            val triangleWidthPx = triangleWidth.toPx()
            val triangleHeightPx = triangleHeight.toPx()
            val diff = offsetX.toPx()

            val triangleStartX = centerX + radius - diff

            if (trianglePath.isEmpty) {
                trianglePath.apply {
                    moveTo(triangleStartX, centerY - triangleHeightPx / 2)
                    lineTo(triangleStartX + triangleWidthPx, centerY)
                    lineTo(triangleStartX, centerY + +triangleHeightPx / 2)
                    lineTo(triangleStartX, centerY - triangleHeightPx / 2)
                }
            }

            rotate(value) {
                drawPath(trianglePath, Color(0xff243f8d))
            }
        }

        Box(
            modifier = Modifier
                .shadow(4.dp, CircleShape)
                .background(Color(0xfff9f9fa))
                .size(diameter)
                .padding(24.dp)
        ) {
            Box(
                modifier = Modifier
                    .shadow(1.dp, CircleShape)
                    .background(Color.White)
                    .matchParentSize()
                    .drawBehind {
                        drawArc(
                            color = Color(0xff6175ad),
                            useCenter = true,
                            startAngle = -60f,
                            sweepAngle = 120f
                        )
                    }
            )
        }
    }
}

Android相关问答推荐

如何将Hilt添加到Android Studio中的Kotlin项目中?

无法安装后重新编译android代码'

合成 colored颜色 的GSON反序列化

Android意图过滤器不限制应用程序仅处理YouTube链接

如何检测HitTest是否命中给定的网格对象?

无法在Android Gradle中同步Chaquopy版本

使用Kotlin/Compose与Java/XML指南的比较

需要 java 17 而不是 java 11:Android CI-CD GitHub Actions

在java android studio项目上安装mapbox

使用 Kotlin 在 Android 中导航时如何防止 ViewModel 被杀死?

设置背景图片组成Column

Jetpack compose (Glance) 小部件在加载位图图像后不会重新组合

AirDroid Business 如何能够从屏幕截图中排除覆盖?

LazyColumn 项目,隐式接收器无法在此上下文中调用单元

使用默认使用 RTL 语言的项目本地化 android 应用程序

Jetpack compose 未解决的参考错误

为什么官方文档用大写字母表示val变量?

如何使用 recyclerview 实现这样的布局?

Сan 无法从 Firestore 获取数据,没有错误

lambda 函数中的类型不匹配 - Kotlin