我正在使用 Jetpack Compose 来实现我绘制“逐渐增长线”的要求,即一条从指定起点和点开始并逐渐“增长”直到到达指定终点的线。 我之前用自定义视图实现了这个,效果很好。我的逻辑要求根据某些条件一次又一次地重新调用“onDraw()”。为此,我在使用自定义视图时使用了 'invalidate()'。但现在我正在使用 Jetpack Compose 并且无法找到重新组合“画布”的方法。
这是我的“逐渐增长线”的 Jetpack 撰写代码:
@Composable
fun SplashUI() {
var test = remember { mutableStateOf(0) }
Canvas(modifier = Modifier.fillMaxSize()) {
// starting point
x1 = 0.0;
y1 = size.height / 2.0;
// ending point
x2 = size.width.toDouble()
y2 = size.height / 2.0;
divideLineIntoEqualParts();
if (test.value < listOfPoints.size) {
drawLine(
Color.Black,
Offset(
listOfPoints.get(0)?.x!!,
listOfPoints.get(0)?.y!!
),
Offset(
listOfPoints.get(inte)?.x!!,
listOfPoints.get(inte)?.y!!
),
strokeWidth = 5f
);
}
test.value = test.value + 1 //This doesn't trigger recomposition of canvas
//Recomposition of Canvas should happen after the above step for my logic to work
//I had implemented this earlier using custom view, and used 'invalidate()' like:
/* if (inte < listOfPoints.size) {
invalidate()
}*/
}
}
private fun divideLineIntoEqualParts() {
listOfPoints.clear()
for (k in 1..50) {
listOfPoints.add(PointF((x1 + k * (x2 - x1) / 50).toFloat(),
(y1 + k * (y2 - y1) / 50).toFloat()
))
}
Log.d("listOfPoints : size : ", listOfPoints.size.toString() + "")
}
请建议我重新组合 Canvas 的方法,或其他一些使我的逻辑正常工作的方法。
答案 0 :(得分:1)
有些区别。
问题中的代码适用于 Android View
,您正在 Canvas
方法中绘制 onDraw
。您正在绘制一条水平线,以点为单位划分可用空间(=宽度)。
在 Compose 中,您只需将 Canvas
用作 Composable
,并且您可以为线的长度设置动画。
类似的东西:
//Animation - it will be repeated 2 times
val animatedProgress = remember { Animatable(0.001f) }
LaunchedEffect(animatedProgress) {
animatedProgress.animateTo(1f,
animationSpec = repeatable(2,
animation = tween(durationMillis = 3000, easing = LinearEasing)
))
}
Canvas(modifier = Modifier.fillMaxSize() ) {
val startingPoint = Offset(0f, size.height / 2f)
val endingPoint = Offset(size.width * animatedProgress.value, size.height / 2f)
//At the end of animation just remove the line
if (animatedProgress.isRunning) {
drawLine(
strokeWidth = 8.dp.toPx(),
color = Color.Black,
start = startingPoint,
end = endingPoint
)
}
}
答案 1 :(得分:0)
我同意 Gabriele Mariotti 的回答,但我发现有时您需要控件以便能够随时在画布中重新绘制!
我正在尝试开发一个绘图应用程序,当触摸事件发生时,我必须使其无效!
在本文中Simple Jetpack Drawing App画布因MotionEvent的动作变化而失效,因此每次运动事件的动作发生变化时,画布都可以失效(重绘)
我们可以使用相同的逻辑
val invalidations = remember{
mutableStateOf(0)
}
现在在 Canvas Composable 中
Canvas {
invalidations.let{inv->
//Draw Composables
}
}
现在只要你想无效:
invalidations.value = invalidations.value++
这不是最好的方法,因为改变一个变量的状态只会导致可组合的重绘,但使这种方式无效将重绘在 invalidations.let 块中绘制的任何内容!