1. 开篇:为什么你的弹窗需要高斯模糊?
不知道你有没有发现,现在越来越多的App,特别是那些设计感很强的,它们的弹窗背景不再是简单的半透明黑色,而是一种毛玻璃一样的效果。你隐约能看到弹窗后面的内容,但又被一层柔和的、朦胧的滤镜所覆盖,这就是高斯模糊。从iOS的毛玻璃效果流行开始,这种设计语言就逐渐成为了提升应用视觉层次和沉浸感的“标配”。
在Android 12之前,想给弹窗加个像样的高斯模糊,那可真叫一个折腾。要么得自己用RenderScript(现在已废弃)或者第三方库去处理Bitmap,性能开销大还容易卡顿;要么就得用一些取巧的“假模糊”背景图,效果生硬不自然。但到了Android 12,谷歌终于把系统级的背景模糊能力给开放出来了,这简直是开发者的福音。
今天,我就来跟你彻底盘一盘Android 12弹窗高斯模糊的两种主流玩法:Style配置和API动态调用。这两种方法我都深度实践过,也踩过不少坑。我会把它们的差异、适用场景、性能表现,还有那些官方文档里没写的“坑点”都掰开揉碎了讲给你听。无论你是想实现弹窗内部模糊、弹窗背后的内容模糊,还是内外都模糊的“双重奏”,看完这篇,你都能找到最稳、最对路的实现方案。咱们不搞虚的,直接上代码,说人话,让你看完就能动手做出来。
2. 基础准备:认识Android 12的高斯模糊新特性
在动手写代码之前,咱们得先搞清楚Android 12到底给了我们什么“武器”。核心就两个东西:窗口背景模糊属性和**RenderEffect API**。它们俩一个偏“静态声明”,一个偏“动态操控”,共同构成了实现模糊效果的基石。
第一个武器:窗口级别的模糊属性。 这主要是通过给你的Dialog或Activity的Theme设置一些新的属性来实现的。你可以把它们理解成给窗户(Window)贴膜。这些属性是系统在窗口合成层直接处理的,所以效率非常高。主要属性有:
android:windowBackgroundBlurRadius:用来模糊弹窗内部自己的背景。比如你的弹窗有个圆角背景,这个属性可以让这个背景本身产生模糊效果。android:windowBlurBehindEnabled和android:windowBlurBehindRadius:这一对是用来模糊弹窗背后的内容的。开启后,弹窗下方的Activity界面会变得模糊。android:windowIsTranslucent:这个不是新属性,但经常需要设置为true来配合工作,确保窗口是半透明的,模糊效果才能透过来。
这些属性直接在styles.xml里配置,系统会自动应用,你几乎不用写什么Java/Kotlin代码,非常省心。但它的“静态”特性也意味着灵活性稍差,比如你想根据不同的场景动态开关模糊效果,只用Style就不太方便了。
第二个武器:View级别的RenderEffect API。 这是Android 12在View类中新增的一个强力方法:setRenderEffect(@Nullable RenderEffect renderEffect)。通过它,你可以给任何View(包括整个窗口的根布局DecorView)施加各种图形效果,其中就包括createBlurEffect来创建模糊效果。
它的强大之处在于动态和精细控制。你可以在任意时刻调用,给任意View设置或清除模糊效果,模糊半径也可以随时调整。这给了我们巨大的创作空间。但相对的,它需要你手动管理生命周期,比如在弹窗关闭时要记得清除效果,否则模糊会一直留在那里。
简单来说,Style像是“装修预设”,一劳永逸但改动麻烦;API像是“智能灯光”,随时可调但需要自己开关。理解了这一点,我们就能根据实际需求做选择了。
3. 实战一:弹窗内部背景高斯模糊(Style方案)
我们先从最常见的需求开始:让弹窗自己的背景变成毛玻璃效果。想象一下,你的弹窗有一个半透明的深色圆角背景,现在想让这个背景材质本身带有模糊感,看起来更柔和、更有质感。
效果与实现思路: 这种效果的核心是使用 android:windowBackgroundBlurRadius 属性。它的作用是模糊窗口背景,也就是你通过 android:windowBackground 指定的那个drawable。所以,我们需要做两件事:1. 定义一个带透明度的背景形状;2. 在主题中启用并设置模糊半径。
第一步:定义弹窗背景(dialog_bg.xml) 这个背景决定了弹窗的基本外观,比如颜色、圆角。为了实现模糊,颜色必须是带透明度的,否则模糊了也看不出来。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 颜色值 #AARRGGBB,前两位是透明度,这里是#2f,大约18%透明度 -->
<solid android:color="#2f000000" />
<!-- 圆角,根据你的设计来 -->
<corners android:radius="20dp" />
</shape>
这里我用了#2f000000,一个接近黑色的半透明色。你也可以用#2fffffff做成白色朦胧效果,或者任何你喜欢的颜色,关键是Alpha通道不能是FF(不透明)。
第二步:创建高斯模糊主题(styles.xml) 接下来,我们创建一个


5425

被折叠的 条评论
为什么被折叠?



