Jetpack Compose加载52×90矩阵过慢,求优化方案
Jetpack Compose 优化大矩阵加载速度的思路
我在学习Jetpack Compose,创建一个90行、每行52个Box的矩阵时,屏幕加载耗时4-5秒,想找快速实现的替代思路。
当前代码:
Column( modifier = Modifier .fillMaxSize() .padding(25.dp, 65.dp, 25.dp, 35.dp) ) { for (year in 0 until 90) { Row(modifier = Modifier.weight(1f)) { for (week in 0 until 52) { if (week == 0) { if (year % 5 == 0) { Box(modifier = Modifier.weight(1f)) { Text( "${year}", fontSize = 5.sp, fontWeight = Bold, textAlign = TextAlign.Start ) } } else { Box(modifier = Modifier.weight(1f)) { Text(" ") } } } else { val color = MaterialTheme.colorScheme.onBackground Box( modifier = Modifier .weight(1f) .border( BorderStroke( 1.dp, MaterialTheme.colorScheme.background ) ) .background(color = color) ) { Text(" ") } } } } } }
优化思路:
用LazyColumn + LazyRow替代静态布局
静态Column+Row会一次性创建所有4680个Composable,Lazy系列只会渲染可见区域的组件,初始加载的组件数量骤减,直接解决加载慢的问题。只需要把外层Column换成LazyColumn,内层Row换成LazyRow,配合items或itemsIndexed遍历数据。提取复用组件
把年份标签、空白占位、网格Box这些重复逻辑抽成单独的Composable,比如YearLabel、GridCell,减少重复代码的同时,让Compose的重组和缓存更高效。砍掉不必要的组件
代码里的Text(" ")完全多余,直接用Box占位就行,少创建几百个Text组件,减少布局和绘制的开销。用Canvas批量绘制
如果只是展示网格和年份标签,直接用Canvas绘制整个矩阵是性能最高的方案:只需要一个Canvas Composable,通过循环计算每个单元格的位置,一次性绘制所有线条、背景和文本,避免大量Composable的创建、布局和测量过程。
内容的提问来源于stack exchange,提问作者Boris Gabyshev
相关产品推荐
相关产品推荐

