Android Compose 图层的合成 : BlendMode

1. 图形的合成是什么 ?

Compose中,图层的合成,通过BlendMode来控制 "显示谁、保留哪部分",常用于裁剪、遮罩、图层叠加。

1.1 初始界面

kotlin 复制代码
@Preview
@Composable
fun MyBlendModeTest() {
    Box {
        Box(
            Modifier
                .size(100.dp)
                .background(Color.Red, CircleShape)
        )
        Box(Modifier
            .padding(start = 30.dp, top = 30.dp)
            .size(100.dp)
            .background(Color.Blue, CircleShape))
    }
}

默认的显示效果

1.2 Modifier.graphicsLayer

Modifier.graphicsLayer会把组件内容绘制到独立图层,变换 / 动画只重绘图层,不触发重组,也不影响父布局测量。

kotlin 复制代码
@Preview
@Composable
fun MyBlendModeTest() {
    Box {
        Box(
            Modifier
                .size(100.dp)
                .background(Color.Red, CircleShape)
        )
        Box(Modifier
            .graphicsLayer(blendMode = ...)
            .padding(start = 30.dp, top = 30.dp)
            .size(100.dp)
            .background(Color.Blue, CircleShape))
    }
}

2. BlendMode : 图层的合成

2.1 BlendMode.SrcOver

graphicsLayer的blendMode的默认值是BlendMode.SrcOver,和不加graphicsLayer的效果一样,叠加在上面。

在图形绘制的概念里

source : 源图形 = 蓝色圆

destination : 目标图形 = 背景 + 红色圆

2.2 BlendMode.DstOver

目标在上、源在下;目标透明处显源。

2.3 BlendMode.Src

仅显示源图,完全覆盖目标。

2.4 BlendMode.Dst

仅显示目标图,丢弃源图。

2.5 BlendMode.SrcIn

仅保留重叠部分,且只显示源图内容(常用作遮罩)

2.6 BlendMode.DstIn

仅保留重叠部分,且只显示目标图内容

2.7 BlendMode.SrcOut

仅保留源图非重叠部分,重叠区透明。

2.8 BlendMode.DstOut

仅保留目标非重叠部分,重叠区透明。

2.9 BlendMode.SrcAtop

2.10 BlendMode.DstAtop

显示源全貌,重叠区用目标图。

2.11 BlendMode.Xor

重叠区透明,非重叠区保留各自

2.12 BlendMode.Clear

清除重叠区域,变透明。

3. BlendMode : 颜色混合

除了图像的合成,还支持颜色的混合。可以基于源与目标的RGB 通道做色彩运算,用于滤镜、特效、艺术合成。

这里介绍其中几个。

3.1 BlendMode.Plus

把源和目标的颜色通道直接相加

3.2 BlendMode.Modulate

只乘颜色通道,不乘 Alpha

3.3 BlendMode.Screen

反色相乘 → 再反色(变亮模式)

3.4 BlendMode.Overlay

根据底色自动选择 Multiply 或 Screen

3.5 BlendMode.Darken

每个通道取更暗的那个

3.6 BlendMode.Lighten

每个通道取更亮的那个

3.7 BlendMode.Hue

只用源的色相,保留目标的饱和度 + 亮度

4. 离屏缓冲

详见我的另一篇博文Android Compose 离屏缓冲

相关推荐
想你依然心痛23 分钟前
嵌入式日志系统:分级日志、环形缓冲区与远程输出——运行时调试、非侵入
android·前端·javascript
用户69371750013842 小时前
AI Agent 里的 Loop 到底是什么?
android·前端·后端
海天鹰2 小时前
安卓分割空字符串数组长度为1
android
Coffeeee2 小时前
从 Android 15 到 Android 17,谷歌猝不及防的音频改动
android·前端·google
用户69371750013843 小时前
AI 领域的 Harness,到底是什么意思?
android·前端·后端
恋猫de小郭4 小时前
Flutter 开发怎么做 Agent ?从工程实战详细给你解读下
android·前端·flutter
安卓修改大师4 小时前
安卓修改大师实战:Activity生命周期全解析与Smali插桩教程
android
zhangphil4 小时前
Android集成封装libjpeg-turbo解码库,Kotlin语言实现
android
码上有光4 小时前
c++:map和set的底层实现
android·java·c++·set·map
峥嵘life4 小时前
Android GMS 开机向导横竖屏切换配置总结
android·学习