Jetpack Compose 中三个好用你却不知道的 Modifier 修饰符

第一个,Text 的跑马灯效果,对标传统 TextView 的跑马灯效果,通过 Modifier.basicMarquee() 即可实现,代码非常简单:

Text(
    text="This text is very long.".repeat(100),
    maxLines = 1,
    modifier = Modifier.basicMarquee()
)

效果:

在这里插入图片描述

第二个,放大镜效果,主要是 Modifier.magnifier 这个修饰符,参考代码如下:

var offset by remember { mutableStateOf(Offset.Zero) }
Box(
   modifier = Modifier
       .fillMaxWidth()
       .pointerInput(Unit) {
           detectDragGestures { change, dragAmount ->
               offset = change.position
           }
       }
       .magnifier(
           sourceCenter = {
               offset
           },
           magnifierCenter = {
               offset - Offset(x = 0f, y = 200f)
           }
       )
) {
   Image(
       painter = painterResource(R.drawable.kermit),
       contentDescription = null,
       modifier = Modifier.fillMaxWidth(),
       contentScale = ContentScale.FillWidth
   )
}

效果如下:

在这里插入图片描述

如果要实现常见的圆形放大镜效果,只需将上面代码稍加修改,为 magnifier 加一个 style 属性配置即可:

var offset by remember { mutableStateOf(Offset.Zero) }
Box(
    modifier = Modifier
        .fillMaxWidth()
        .pointerInput(Unit) {
            detectDragGestures { change, dragAmount ->
                offset = change.position
            }
        }
        .magnifier(
            sourceCenter = {
                offset
            },
            magnifierCenter = {
                offset - Offset(x = 0f, y = 200f)
            },
            style = MagnifierStyle(
                size = DpSize(100.dp, 100.dp),
                cornerRadius = 100.dp
            )
        )
) {
    Image(
        painter = painterResource(R.drawable.kermit),
        contentDescription = null,
        modifier = Modifier.fillMaxWidth(),
        contentScale = ContentScale.FillWidth
    )
}

效果如下:

在这里插入图片描述

第三个,Modifier.drawWithContent,这个修饰符可以让我们在原本组件内容绘制的之前和之后的时机做一些自己的绘制操作,比如在原来的文字图片后面画个背景,或者在原来的内容之上画个圆画个圈、添加一些小装饰啥的,别提有多方便了。

下面是一个简单的示例:

@Preview(showBackground = true)
@Composable
fun DrawBefore() {
    Box(
        modifier = Modifier.size(120.dp),
        contentAlignment = Alignment.Center
    ) {
        Card(
            shape = RoundedCornerShape(8.dp),
            modifier = Modifier
                .size(100.dp)
                .drawWithContent {
                	// 显示在drawContent()的下层,即背景
                    drawRect( 
                        Color.Green,
                        size = Size(110.dp.toPx(), 110.dp.toPx()),
                        topLeft = Offset(x = -5.dp.toPx(), y = -5.dp.toPx()),
                        //style = Stroke(width = 5f)
                    )
                    // 在 drawContent() 的前后自定义绘制一些内容,可以控制绘制的层级
                    drawContent()
                    drawCircle( // 显示在drawContent()的上层层,即前景
                        Color(0xffe7614e),
                        radius = 18.dp.toPx() / 2,
                        center = Offset(drawContext.size.width, 0f)
                    )
                }
        ) {
            Image(
                painter = painterResource(id = R.drawable.ic_head3),
                contentDescription = "head",
                contentScale = ContentScale.Crop
            )
        }
    }
}

drawWithContent修饰符的lambda中,drawContent()这一句是必须调用的,它是组件原本的绘制内容,而在它的前后可以分别Canvas的Api进行自定义绘制,最终会分别显示为原本内容的背景和前景。

显示效果如下:

在这里插入图片描述

其实像这样方便的 DrawModifier 修饰符,Compose 总共提供了三个: drawWithContentdrawBehinddrawWithCache。不一一介绍了,感兴趣可以看这篇:Jetpack Compose 中的 Canvas ,这篇文章里我已经全部整理好了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值