• Android:使用Jetpack Compose画渐变背景


    系列文章目录



    前言

    在这里插入图片描述

    如上图所示,当UI设计中有渐变背景的控件时,传统方式可以使用xml来画,但是,渐变色最多只能设置3种(即起始颜色,中间颜色,结束颜色),更多的颜色不支持;或者直接美工切图,由于内容长度不固定,可能还需要制作.9.png图片,并设置拉伸区域,麻烦且会比较占用APK大小。现在我们完全可以使用Compose纯Kotlin代码来实现,支持多个色渐变。


    一、Brush(笔刷)

    系统默认提供了五种Brush(笔刷),分别是:horizontalGradient(横向渐变)、verticalGradient(纵向渐变)、linearGradient(线性渐变)、radialGradient(环形渐变)、sweepGradient(扫描渐变)。

    1. horizontalGradient(横向渐变)

    1.1 仅设置颜色

    		Box(
                modifier = Modifier
                    .size(100.dp, 40.dp)
                    .background(
                        brush = Brush.horizontalGradient(
                            listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            )
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    请添加图片描述

    1.2.平铺模式:Clamp(夹紧)

    	Box(
                modifier = Modifier
                    .size(100.dp, 40.dp)
                    .background(
                        brush = Brush.horizontalGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            ),
                            startX = 50f,
                            endX = 150f,
                            tileMode = TileMode.Clamp
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    横向渐变
    渐变位置(X轴):50f——150f
    平铺模式:Clamp(夹紧)
    在这里插入图片描述

    1.3.平铺模式:Decal(印花)

    	Box(
                modifier = Modifier
                    .size(100.dp, 40.dp)
                    .background(
                        brush = Brush.horizontalGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            ),
                            startX = 50f,
                            endX = 150f,
                            tileMode = TileMode.Decal
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    横向渐变
    渐变位置(X轴):50f——150f
    平铺模式:Decal(印花)
    在这里插入图片描述

    1.4.平铺模式:Mirror(镜面)

    Box(
                modifier = Modifier
                    .size(100.dp, 40.dp)
                    .background(
                        brush = Brush.horizontalGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            ),
                            startX = 50f,
                            endX = 150f,
                            tileMode = TileMode.Mirror
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    横向渐变
    渐变位置(X轴):50f——150f
    平铺模式:Mirror(镜面)
    在这里插入图片描述

    1.5.平铺模式:Repeated(重复)

    	Box(
                modifier = Modifier
                    .size(100.dp, 40.dp)
                    .background(
                        brush = Brush.horizontalGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            ),
                            startX = 50f,
                            endX = 150f,
                            tileMode = TileMode.Repeated
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    横向渐变
    渐变位置(X轴):50f——150f
    平铺模式:Repeated(重复)
    在这里插入图片描述

    2. verticalGradient(纵向渐变)

    	Box(
                modifier = Modifier
                    .size(40.dp, 100.dp)
                    .background(
                        brush = Brush.verticalGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            ),
                            startY = 50f,
                            endY = 150f,
                            tileMode = TileMode.Clamp
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    纵向渐变
    渐变位置(Y轴):50f——150f
    平铺模式:Clamp(夹紧)
    在这里插入图片描述

    3.linearGradient(线性渐变)

    3.1.默认是从左上角向右下角渐变

    	Box(
                modifier = Modifier
                    .size(100.dp, 50.dp)
                    .background(
                        brush = Brush.linearGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            )
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    3.2.设置渐变位置

    	Box(
                modifier = Modifier
                    .size(100.dp, 50.dp)
                    .background(
                        brush = Brush.linearGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            ),
                            start = Offset(0f, 0f),
                            end = Offset(100f, 50f)
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    线性渐变
    起始位置坐标:(0,0)
    结束位置坐标:(100,50)
    在这里插入图片描述

    4. radialGradient(环形渐变)

    4.1. 默认

    	Box(
                modifier = Modifier
                    .size(50.dp, 50.dp)
                    .background(
                        brush = Brush.radialGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            )
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    4.2. 设置中心坐标与半径

    	Box(
                modifier = Modifier
                    .size(50.dp, 50.dp)
                    .background(
                        brush = Brush.radialGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            ),
                            center = Offset(30f, 30f),
                            radius = 20f
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    环形渐变
    中心坐标:(30,30)
    半径:20
    在这里插入图片描述

    5. sweepGradient(扫描渐变)

    5.1.默认

    	Box(
                modifier = Modifier
                    .size(50.dp, 50.dp)
                    .background(
                        brush = Brush.sweepGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            )
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    5.2. 设置中心坐标

    Box(
                modifier = Modifier
                    .size(50.dp, 50.dp)
                    .background(
                        brush = Brush.sweepGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            ),
                            center = Offset(30f, 30f)
                        )
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    扫描渐变
    中心坐标:(30,30)
    在这里插入图片描述

    6.自定义颜色之间的过渡位置

    通过传入Pair<Float, Color>类型的多个颜色,还可以控制颜色之间的过渡位置。
    例如:

    Brush.linearGradient(
         0.0f to Color.Red,
         0.3f to Color.Green,
         1.0f to Color.Blue,
         start = Offset(0.0f, 50.0f),
         end = Offset(0.0f, 100.0f)
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、实例:渐变圆角矩形边框

    代码如下:

    Box(
                modifier = Modifier
                    .size(100.dp, 50.dp)
                    .border(
                        brush = Brush.linearGradient(
                            colors = listOf(
                                Color.Red,
                                Color.Green,
                                Color.Blue
                            )
                        ),
                        width = 1.dp,
                        shape = RoundedCornerShape(4.dp)
                    )
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述


    总结

    以上就是今天要讲的内容,平时使用Compose画控件背景还是非常简单的,基本上用不到xml,这也是Compose的目标,抛弃xml的画布局方式。

  • 相关阅读:
    Spring Boot集成Hibernate Envers自定义修订实体使用多个数据源
    c++ stl(标准模板库)
    Flutter 自定义动画 — 数字递增动画和文字逐行逐字出现或消失动画
    java实现快速排序的方法
    基于粒子群算法优化的lssvm回归预测-附代码
    Linux开发——用户权限管理(六)
    【六袆 - Framework】Angular-framework;前端框架Angular发展的由来0001;
    火遍全网的DPU,到底是个啥?
    C++智能指针(1)
    Hadoop下载与安装
  • 原文地址:https://blog.csdn.net/sange77/article/details/125624007