Activity 具有透明背景和模糊滤镜

Activity with transparent background and blur-filter

我目前正在开发一个应用程序,我想在其中打开一个具有透明背景的 Activity,以便我可以看到它下面的 activity。这很简单,我很快就解决了。但是,现在我还想添加某种模糊滤镜,使 activity 下面的 activity 看起来模糊不清。

我四处搜索并尝试了几种不同的解决方案,但没有成功,所以我试图将其添加为问题。有谁知道解决这个问题的好方法吗?

谢谢

有很多图书馆可以做到这一点。 Here's one list of them. Personally I've used BlurView (I hope linking to one of the libraries is not against site rules) but I've had to patch the library a bit, see this issue - 拉取请求尚未提交。我也遇到过动画性能问题。

基本上所有的库都做同样的事情:

  • 为位图创建Canvas,缩小尺寸(例如小 4 倍),设置变换矩阵以应用此缩放
  • 将 window 的背景渲染为 Canvas
  • 将 Activity 的根视图渲染到 Canvas
  • 使用 ScriptIntrinsicBlur
  • 模糊 Canvas 的位图
  • 绘制位图作为视图的背景,按比例放大,例如4次

为什么缩放?出于性能原因。绘制小 4 倍的所有内容要快得多,而且由于放大,模糊效果变得 "stronger" - ScriptIntrinsicBlur 一次通过可以模糊多少是有限制的,多次通过再次减慢速度。

对于 API < 14,您可以使用标记 WindowManager.LayoutParams.FLAG_BLUR_BEHIND。 对于更高的 APIS,这不再受支持。

但是,您可以使用视图执行此操作。

从您的 activity 的总体布局创建一个位图,然后用您想要的任何方法对该位图进行模糊处理。在您的布局中添加(或取消隐藏)一个涵盖所有内容的视图,您的问题就解决了。