使用 Jetpack Compose 在屏幕上绘画时使用屏幕触摸事件(或 MotionEvents)只有几个指南。我找到的所有指南都涉及:
- 将触摸事件链接到 Jetpack Compose
State
,以便在每个新的触摸动作上触发重新组合(有点像invalidate()
在旧的基于视图的 Android 方法中调用); - 将该事件更改保存到记住的列表中;
- 然后在每次重组时重新绘制整个列表。
我找到的最好的指南是:Code Simple Android Jetpack Compose Drawing App ,这里有完整的代码。
只有几百个触摸事件,该算法的响应速度惊人。但是当列表中有数千个事件时,它开始变得有点像Schlemiel the Painter's Algorithm,并且变得越来越慢,直到它最终停止工作。
在旧的 Kotlin/Android 中,解决方法通常是绘制到由 bitmap 支持的 Canvas,因此您不需要在每个invalidate()
. 但是我在 Jetpack Compose 中找不到无缝保存到位图的画布。
Jetpack Compose 中是否有一种方法可以简化remember
Composable Canvas 的内容,因此不需要在每次重新组合时重新绘制整个 Canvas?
如果做不到这一点,有没有办法用位图支持 Jetpack Compose Canvas,就像在旧的 Canvas 中一样?
据我所知,Jetpack Compose Painter()对象是我们应该使用的对象,但我终生无法弄清楚如何去做。
在 Painter() 对象中,我不知道如何访问一个drawScope
在其中发出动态 Compose 命令的方法,例如drawLine
和drawCircle
。我能找到的只是你可以覆盖的地方drawScope.onDraw()
,但我不知道如何将它用于我想要的。
任何指向我正确方向的帮助都会很棒!