android compose Brush 渐变和着色器 使用

android compose Brush 渐变和着色器 使用

Compose 中的 Brush 用于描述内容在屏幕上的绘制方式:它 可以确定要在绘制区域(即圆形、 方形、路径)中绘制的颜色。有一些内置 Brush 对绘制非常有用,例如 LinearGradientRadialGradient 或普通的 SolidColor Brush。

Brush 可与 Modifier.background()TextStyleDrawScope 绘制调用搭配使用,以将绘制样式应用于要绘制的内容。

复制代码
package com.wn.androidcomposedemo1.basegoogleimage

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Canvas
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.ImageShader
import androidx.compose.ui.graphics.ShaderBrush
import androidx.compose.ui.graphics.TileMode
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.imageResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.wn.androidcomposedemo1.R
import com.wn.androidcomposedemo1.ui.theme.AndroidComposeDemo1Theme

/**
 * Author : wn
 * Email : maoning20080808@163.com
 * Date : 2026/7/3 20:02
 * Description : 渐变和着色器
 */
class BrushActivity : ComponentActivity(){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            AndroidComposeDemo1Theme() {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    BrushExample()
                }
            }
        }
    }

    @Composable
    fun BrushExample(){
        Column(
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Spacer(Modifier.height(20.dp))
            Text("Brush渐变和着色器使用", fontSize = 30.sp, color = Color.Red)
            Row() {
                BrushCircleExample()
                RadialGradientExample()
            }
            Row() {
                CustomColorExample()
                Spacer(Modifier.width(10.dp))
                TileModeExample()
            }

            BrushImage()
        }
    }

    //圆形着色器
    @Composable
    fun BrushCircleExample(){
        val brush = Brush.horizontalGradient(listOf(Color.Red, Color.Blue))
        Canvas(
            modifier = Modifier.size(200.dp),
            onDraw = {
              drawCircle(brush)
            })
    }

    //径向着色器
    @Composable
    fun RadialGradientExample(){
        val brush = Brush.radialGradient(listOf(Color.Red, Color.Blue))
        Canvas(
            modifier = Modifier.size(200.dp),
            onDraw = {
                drawCircle(brush)
            })
    }

    //自定义颜色
    @Composable
    fun CustomColorExample(){
        val colorStops = arrayOf(
            0.0f to Color.Yellow,
            0.2f to Color.Red,
            1f to Color.Blue
        )

        Box(
            modifier = Modifier.requiredSize(200.dp)
                .background(Brush.horizontalGradient(colorStops = colorStops))
        )
    }

    //重复图案
    @Composable
    fun TileModeExample(){
        val listColors = listOf(Color.Yellow, Color.Red, Color.Blue)
        val tileSize = with(LocalDensity.current){
            50.dp.toPx()
        }

        Box(
            modifier = Modifier.requiredSize(200.dp)
                .background(
                    Brush.horizontalGradient(listColors,
                        endX = tileSize,
                        tileMode = TileMode.Repeated
                        )
                )
        )
    }

    @Composable
    fun BrushImage(){
        val imageBrush = ShaderBrush(ImageShader(ImageBitmap.imageResource(id = R.drawable.dog)))

        Text("Hello Compose!",
                style = TextStyle(
                    brush = imageBrush,
                    fontWeight = FontWeight.ExtraBold,
                    fontSize = 36.sp
                )
            )

        Canvas(
            onDraw = {
                drawCircle(imageBrush)
            }, modifier = Modifier.size(200.dp)
        )
    }

}
相关推荐
Go-higher1 小时前
DriverTest 驾考知识卡片学习助手 —— 一款基于 Jetpack Compose 的现代 Android 学习APP
android·学习
安卓修改大师2 小时前
安卓修改大师APK控件修改实战教程
android
阿pin2 小时前
Android随笔-Zygote是什么?
android·zygote
小虎牙0072 小时前
Android kotlin图片库Coil源码详解
android·前端
AFinalStone3 小时前
Android 7系统网络(一)全景图与调用链路概览
android·网络·frameworks
用户86022504674723 小时前
Android DEX 内存 Dump 全流程实战:从 APK 提取到无特征内存盲扫
android
杉氧6 小时前
兼容与共生:如何在旧项目中优雅地引入 Compose?
android·架构·android jetpack
Flynt7 小时前
Room 3.0 包名重构 + KMP 迁移:我把项目升级踩了个遍
android·数据库·kotlin
杉氧7 小时前
性能优化实战:如何定位冗余重组并榨干 Compose 的每一帧性能?
android·架构·android jetpack