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

}
相关推荐
执明wa2 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
404_coder3 小时前
源码视角下的 Android 开机流程:从 Zygote、SystemServer 到 Launcher
android
二流小码农3 小时前
鸿蒙开发:以登录案例了解代码架构MVVM
android·ios·harmonyos
用户69371750013844 小时前
从代码生产者到 AI 协作者:软件工程师的角色重构
android·前端·后端
GitLqr4 小时前
别在 Flutter 的 main() 里乱锁屏幕方向,小心 iPad 分屏功能被你搞没了
android·flutter·ios
sg_knight4 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db
爱笑鱼4 小时前
Binder(四):ioctl(BINDER_WRITE_READ) 之后,事务怎样到达目标进程?
android
AFinalStone4 小时前
Android 7系统休眠唤醒(二)开机全链路—BootROM到Launcher
android·电源管理·休眠唤醒
Mr YiRan5 小时前
Android NDK开发之统计到未被回收的图片
android