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

相关推荐
yi0113 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
志尊宝4 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
weixin_448119946 小时前
Datawhale Easy Data × AI:笔记1 已重做,看新的笔记
笔记
要开心吖ZSH6 小时前
MySQL 慢 SQL 排查操作手册-个人笔记版
java·笔记·sql·mysql·慢查询
咖啡忍者8 小时前
【SAP】程制造生产计划PP-PI(Production Planning for Process Industries)
笔记
Titan20248 小时前
MySQL索引学习笔记
笔记·学习·mysql
zhangrelay9 小时前
Arduino-MEGA-ESP单片机理论课笔记02-硬件-2026
笔记·单片机·嵌入式硬件
AOI小白新手上路9 小时前
VDMamba·AutoDL 复现笔记 · 学习笔记
笔记·学习
ACP广源盛1392462567310 小时前
USB3.0 高速信号切换方案评估,LH3412 @ACP双通道差分开关硬件选型笔记
笔记·硬件架构·硬件工程·国产芯片·开关
自不量力的A同学11 小时前
Goldfish Scheme v18.11.39 发布了:迈向现代宏系统与多核并发
笔记