Android-倾斜列表-Compose篇

760 阅读1分钟

前言

继上篇 Android-倾斜列表之后, 想着用 Compose 也实现一下.所以很快就来了~

效果

listview-compose.gif

不同

开始是以使用RecyclerView自定义item的思路来实现的, 最后发现, 由于绘制原理的不同, 导致了很多问题.

问题一

Compose 的 padding 不能设置负边距值. 想设置的话要用到 offset(y = -item.marginTop.dp)

问题二

即使是用 offset 设置负间距, Compose 也不会把整个 Box 上移, 也就是 Y 轴的最低值没有变化, 导致不仅每个item需要上移的值不一样, 而且整体上移后, 列表底部会有一片空出部分(item填充后列表的Y坐标).

1636185859(1).png

解决

用了一个取巧的方式, 绘制平行四边形的 ComposableBox 包住的. Canvas 的绘制能超出 Box 的大小范围.

@Composable
private fun DrawParallel(item: ThemeItemInfo) {
    Canvas(modifier = Modifier.fillMaxSize()) {
        val canvasWidth = size.width
        val canvasHeight = 120.dp.toPx() //固定120
        val path = Path().apply {
            moveTo(0f, 90f)
            lineTo(canvasWidth, 4f)
            lineTo(canvasWidth, (canvasHeight - 90))
            lineTo(0f, (canvasHeight - 4))
        }
        drawPath(path = path, color = item.bgColor)
    }
}
Box(modifier = Modifier
    .fillMaxWidth()
    .height(90.dp) //固定90
    )

所以把 Box 的大小设置 小于 平行四边形的大小.就能根据列表的排列方式形成一定的间距.

总结

Compose 和 View 由于原理不同, 实现方式有一定的差别. 但整体的思路是相同的.

Compose 很棒, 但需要完善和优化的地方还有很多!