Android Compose 椭圆形渐变

示例


使用了自带的圆形渐变 Brush.radialGradient ,将它放大成所需宽度,再在外部嵌套一个Box进行多余内容裁剪。

实现

/**
 * Elliptical gradient
 *椭圆渐变
 */
@Composable
fun EllipticalGradientBox(
    modifier: Modifier = Modifier,
    innerPaddingValues: PaddingValues = PaddingValues(0.dp),
    centerColor: Color = Color(0xFFffbf3f),
    edgeColor: Color = Color(0xFFfff2c3),
    content: @Composable () -> Unit
) {
    var boxWidth by remember { mutableIntStateOf(0) }
    var boxHeight by remember { mutableIntStateOf(0) }

    Box(
        modifier = modifier
            .wrapContentWidth()
            .clip(shape = RoundedCornerShape(200.dp)) // 椭圆形裁剪
            .onGloballyPositioned { layoutCoordinates ->
                // 获取宽高信息
                boxWidth = layoutCoordinates.size.width
                boxHeight = layoutCoordinates.size.height
            }
    ) {
        val aspectRatio = if (boxHeight > 0) boxWidth / boxHeight.toFloat() else 1f
        // 内部的渐变背景
        Box(
            modifier = Modifier
                .matchParentSize()
                .scale(aspectRatio, 1f) // 根据宽高比调整缩放
                .background(
                    brush = Brush.radialGradient(
                        colors = listOf(
                            centerColor, // 中心的深黄色
                            edgeColor, // 边缘的浅黄色
                        )
                    ),
                )
        )

        Box(
            modifier = Modifier.padding(innerPaddingValues),
            contentAlignment = Alignment.Center
        ) {
            content()
        }

    }
}

使用方法

 EllipticalGradientBox(
                innerPaddingValues = PaddingValues(horizontal = 14.dp, vertical = 4.dp)
            ){
                Text(
                    text = "Nu1099025815",
                    fontSize = 30.sp,
                    fontWeight = FontWeight.W500,
                    color = Color(0xff7a4d06)
                )
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值