Compose笔记(七十四)--BlurMaskFilter

这一节主要了解一下Compose中使用BlurMaskFilter,因为Compose UI组件没有直接封装该API,在Compose中使用BlurMaskFilter,主要是通过DrawScope.drawIntoCanvas结合Android原生Canvas和Paint实现.总结如下:

API:

BlurMaskFilter 用于给绘制内容添加模糊效果,支持如下模糊模式:

栗子:

Kotlin 复制代码
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Slider
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
import androidx.compose.ui.graphics.nativeCanvas
import androidx.compose.ui.unit.dp
import android.graphics.BlurMaskFilter
import android.graphics.Paint

@Composable
fun BlurMaskDemo() {
 
    var blurRadius by remember { mutableFloatStateOf(10f) }

    Column(
        modifier = Modifier.fillMaxSize().padding(20.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        
        Text(text = "模糊半径:${blurRadius.toInt()}dp")
        Slider(
            value = blurRadius,
            onValueChange = { blurRadius = it },
            valueRange = 0f..50f,
            modifier = Modifier.padding(horizontal = 20.dp)
        )

       
        Canvas(
            modifier = Modifier
                .fillMaxSize()
                .weight(1f)
        ) {
           
            val textPaint = Paint().apply {
                textSize = 50f 
                color = android.graphics.Color.WHITE
                maskFilter = BlurMaskFilter(blurRadius, BlurMaskFilter.Blur.SOLID)
            }

            drawIntoCanvas { canvas ->
                canvas.nativeCanvas.drawText(
                    "Compose Blur",
                    size.width / 2 - 200f, 
                    size.height / 3,      
                    textPaint
                )
               
                textPaint.maskFilter = null 
                textPaint.color = android.graphics.Color.BLUE
                canvas.nativeCanvas.drawText(
                    "Compose Blur",
                    size.width / 2 - 200f,
                    size.height / 3,
                    textPaint
                )
            }

           
            val circlePaint = Paint().apply {
                color = android.graphics.Color.RED
                isAntiAlias = true
                maskFilter = BlurMaskFilter(blurRadius, BlurMaskFilter.Blur.NORMAL)
            }

            drawIntoCanvas { canvas ->
                canvas.nativeCanvas.drawCircle(
                    size.width / 2,
                    size.height * 2 / 3,
                    80f, 
                    circlePaint
                )
            }
        }
    }
}
Kotlin 复制代码
import android.graphics.BlurMaskFilter
import android.graphics.Paint
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Slider
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
import androidx.compose.ui.graphics.nativeCanvas
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp

@Composable
fun BlurMaskExample02() {
    var blurRadius by remember { mutableFloatStateOf(30f) }

    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(20.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(
            text = "模糊强度: ${blurRadius.toInt()}",
            fontSize = 18.sp
        )

        Slider(
            value = blurRadius,
            onValueChange = { blurRadius = it },
            valueRange = 0f..80f,
            modifier = Modifier.padding(horizontal = 20.dp)
        )

        Spacer(modifier = Modifier.height(30.dp))

       
        Canvas(
            modifier = Modifier
                .fillMaxWidth()
                .height(450.dp)
        ) {
            val cx = size.width / 2
            val cy = size.height / 2

            drawIntoCanvas { canvas ->
                val nativeCanvas = canvas.nativeCanvas

                val outerPaint = Paint().apply {
                    color = android.graphics.Color.parseColor("#9C27B0")
                    style = Paint.Style.STROKE
                    strokeWidth = 40f
                    isAntiAlias = true
                    maskFilter = BlurMaskFilter(blurRadius, BlurMaskFilter.Blur.OUTER)
                }
                nativeCanvas.drawCircle(cx, cy, 180f, outerPaint)

               
                val middlePaint = Paint().apply {
                    color = android.graphics.Color.parseColor("#00BCD4")
                    style = Paint.Style.STROKE
                    strokeWidth = 35f
                    isAntiAlias = true
                    maskFilter = BlurMaskFilter(blurRadius * 0.8f, BlurMaskFilter.Blur.NORMAL)
                }
                nativeCanvas.drawCircle(cx, cy, 130f, middlePaint)

               
                val innerPaint = Paint().apply {
                    color = android.graphics.Color.parseColor("#FFEB3B")
                    style = Paint.Style.FILL
                    isAntiAlias = true
                    maskFilter = BlurMaskFilter(blurRadius * 0.6f, BlurMaskFilter.Blur.SOLID)
                }
                nativeCanvas.drawCircle(cx, cy, 80f, innerPaint)

               
                val centerPaint = Paint().apply {
                    color = android.graphics.Color.WHITE
                    isAntiAlias = true
                    maskFilter = BlurMaskFilter(25f, BlurMaskFilter.Blur.NORMAL)
                }
                nativeCanvas.drawCircle(cx, cy, 20f, centerPaint)
            }
        }
    }
}

注意:

1 限制模糊绘制的范围

2 避开高频刷新场景

3 避免重复创建Paint和BlurMaskFilter

相关推荐
一木 之林7 小时前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
箓维12 小时前
TCP Socket的进阶实现
网络·笔记·tcp/ip
二哈赛车手12 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
星恒随风14 小时前
Linux网络编程:应用层协议究竟是什么?从网络计算器到TCP Socket抽象基类完整实现
linux·网络·笔记·tcp/ip
智学AI15 小时前
AI博主写作素材管理方法分享:资料归集、笔记关联与文档归档
人工智能·笔记
叼烟扛炮15 小时前
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战
服务器·开发语言·网络·笔记·学习·langchain
weixin_4481199415 小时前
Datawhale Jev Cookbook 202610 笔记5
笔记
一木 之林16 小时前
Dify学习笔记 04 · 检索底座:Embedding、Rerank与向量数据库(第46-54集)
笔记·学习·embedding·dify
ljt272496066116 小时前
Python笔记(十一)--Numpy(一)
笔记·python·numpy
芯思路16 小时前
STM32开发学习笔记之十【AI部署】
笔记·stm32·学习