【发布时间】:2021-01-31 03:25:41
【问题描述】:
我正在尝试将一个相当复杂的 Android 视图移植到 Compose,并且通过基本上使用 Canvas 并将 onDraw() 代码移到那里,我已经成功地完成了一个简单的实现。在尝试优化它以使其跳过不需要的重组部分时,我遇到了问题。
视图是围棋游戏的棋盘(国际象棋也是如此)。我试图让诸如棋盘背景之类的东西在每次移动时都不会重绘,因为背景不会改变。根据我对文档的理解,如果我从 onDraw 中提取 drawBackground() 并将其放入 Image() 可组合项中,则 Image() 可组合项不应重新组合,除非其参数(只是位图)发生更改。但是,断点显示每次位置变化时都会调用该方法(例如玩家移动)。难道我做错了什么?我如何在此处利用 Compose?
代码:
@Composable
fun Board(modifier: Modifier = Modifier, boardSize: Int, position: Position?, candidateMove: Point?, candidateMoveType: StoneType?, onTapMove: ((Point) -> Unit)? = null, onTapUp: ((Point) -> Unit)? = null) {
val background: ImageBitmap = imageResource(id = R.mipmap.texture)
Box(modifier = modifier
.fillMaxWidth()
.aspectRatio(1f)
) {
Image(bitmap = background) // Expecting this to run only once, but gets run every time Board() gets recomposed!!!
var width by remember { mutableStateOf(0) }
val measurements = remember(width, boardSize) { doMeasurements(width, boardSize, drawCoordinates) }
var lastHotTrackedPoint: Point? by remember { mutableStateOf(null) }
Canvas(modifier = Modifier.fillMaxSize()) {
if (measurements.width == 0) {
return@Canvas
}
//... lots of draw code here
}
}
}
任何 Jetpack Compose 大师都可以帮助我理解为什么它没有跳过该重组?
【问题讨论】:
标签: android android-jetpack-compose