JetpackCompose LazyVerticalGrid绘制条目边框border

LazyVerticalGrid绘制条目边框border

假设现在要制作一个计算器的输入界面。

内置边框

可能我们都会这样去实现。

直接使用 TextButton来代替条目,在border中给其加入边框属性。

val showItemValues : List<String> = listOf(
        "1","2","3","日期",
        "4","5","6","+",
        "7","8","9","-",
        ".","0","退格","完成"
    )

LazyVerticalGrid(
        cells = GridCells.Fixed(4),
        modifier = modifier.fillMaxWidth()
    ){

        items(showItemValues){

            TextButton(
                border = BorderStroke(1.dp,Color.Black),
                shape = RoundedCornerShape(0),
                onClick = { /*TODO*/ },
                colors = ButtonDefaults.textButtonColors(contentColor = Color.Black),
                contentPadding = PaddingValues(top = 0.dp)
            ) {
                Text(
                    modifier = Modifier.padding(vertical = 20.dp),
                    text = it
                )
            }
        }
}

那么得到的结果可能是这样的。

在这里插入图片描述

通过图片不难观察到,每个item都绘制了四条边框,导致中间部分出现了边框重叠(叠加),观感体验不太好。

自主实现

查api

点进去LazyVerticalGrid发现内置的参数如下,只看到了个contentPadding即条目之间的间距。

可能没有条目边框相关的属性。

fun LazyVerticalGrid(
    cells: GridCells,
    modifier: Modifier = Modifier,
    state: LazyListState = rememberLazyListState(),
    contentPadding: PaddingValues = PaddingValues(0.dp),
    content: LazyGridScope.() -> Unit
)

通过图片观察不难发现,其实我们只需要绘制每个item的下边框及最右边框线。

在这里插入图片描述

很容易我们可以得到组合代码,边框线我们可以使用Divider替代。

items(showItemValues){

  Column() {
    Row(
      modifier = modifier.height(intrinsicSize = IntrinsicSize.Min)
    ) {
      TextButton(
        shape = RoundedCornerShape(0),
        modifier = Modifier.weight(1f),
        onClick = { /*TODO*/ },
        colors = ButtonDefaults.textButtonColors(contentColor = Color.Black),
        contentPadding = PaddingValues(top = 0.dp)
      ) {
        Text(
          modifier = Modifier.padding(vertical = 20.dp),
          text = it
        )
      }
      Divider(modifier = Modifier.fillMaxHeight().width(1.dp))
    }
    Divider(thickness = 1.dp, color = Color.LightGray)
  }
}

效果图

在这里插入图片描述

到这一步大体上已经实现我们想要的效果了,但是细心的同学不难发现,最右侧我们多绘制了一条边框线,但是最左侧没有,很突兀。

当然加入一个小小的计算就能解决该问题。

        /**
         * 边框绘制
         * 下边框线总是绘制,右边框线看计算情况绘制
         */
        itemsIndexed(showItemValues) { index, item ->

            val isRightBorderDraw = (((index + 1) % 4) != 0)

            Column() {
                Row(
                    modifier = modifier.height(intrinsicSize = IntrinsicSize.Min)
                ) {
                    TextButton(
                        modifier = Modifier.weight(1f),
                        shape = RoundedCornerShape(0),
//                        border = BorderStroke(1.dp, Color.LightGray),
                        onClick = { /*TODO*/ },
                        colors = ButtonDefaults.textButtonColors(contentColor = Color.Black),
                        contentPadding = PaddingValues(top = 0.dp)
                    ) {
                        Text(
                            modifier = Modifier.padding(vertical = 20.dp),
                            text = item
                        )
                    }

                    //有边框线
                    if (isRightBorderDraw) {
                        Divider(modifier = Modifier.fillMaxHeight().width(1.dp))
                    }
                }
                Divider(thickness = 1.dp, color = Color.LightGray)
            }
        }

最终效果(最后一行下边框线还是存在哦,你们看看如何解决吧~)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值