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)
        )
    }

}
相关推荐
码农coding8 小时前
android12 开机动画分析
android
又见情义10 小时前
RK3568 Android 13 开机时间优化-禁用非必要系统服务
android
Android-Flutter10 小时前
Java Thread 和 Runnable 详解
android
mmsx10 小时前
osmdroid Overlay 体系详解:比例尺/罗盘/总绘图层有序叠放
android·源码·地图·osmdroid
又见情义12 小时前
RK3568 Android 13 开机时间优化-HAL 服务延时启动
android
v_348360876213 小时前
Android8 开机动画结束分析
android
美狐美颜SDK开放平台15 小时前
直播APP开发核心功能详解:美颜SDK、音视频、礼物等功能成本怎么计算?
android·人工智能·计算机视觉·音视频·直播美颜sdk
安河桥。15 小时前
Android视频流处理模块硬件加速器数据流转技术说明
android·图像处理·isp
hunterandroid15 小时前
[Android 从零到一] APK 体积优化实战:从 50MB 到 15MB 的瘦身之旅
android·前端