android13 FLAG_BLUR_BEHIND 壁纸高斯模糊,毛玻璃背景方案设计-千里马framework实战

MIUI 6的毛玻璃效果的技术实现(实时模糊) 说说MIUI 6的毛玻璃效果的技术实现。 很久以前我们的文件夹打开和最近任务等几个地方就使用了毛玻璃效果,在技术上讲就是背景模糊。应该是比iOS 7的使用要早很多。不过那时候我们使用的是先对背景截图,再将其模糊处理,然后作为app的背景图,所以是一张静止的图片,当背景内容发生变化时模糊的图片并不会随之变化,因此比较生硬。而iOS 7的背景模糊则是实时的,当背景变化的时候,模糊内容 阅读详情
AI摘要

文章介绍了高斯模糊在Android中的应用场景,如状态栏下拉时的背景模糊效果,提供了两种实现方案,包括传统的截图处理和新版本Android的FLAG_BLUR_BEHIND方法,后者能实现实时模糊。详细解析了FLAG_BLUR_BEHIND的使用及源码分析,涉及WindowState和SurfaceFlinger的相关处理。

hi,粉丝朋友们!
今天有个学员朋友,问到了一个高斯模糊相关问题,这个高斯模糊相关的需求我相对还是比较熟悉,下面来重点讲解一下新版本高斯模糊相关的实现。

1、高斯模糊应用场景

在这里插入图片描述

状态栏下拉时候可以看到桌面的画面作为背景,但是这个时候桌面的画面却是被高斯模糊的,这样给人交互体验上就有一个很大提升,美观层度和主次分明,就像拍照时候的人物一样,会把背景等模糊,把人物作为重点。

2、高斯模糊实现方案

在这里插入图片描述

方案1 截图这种属于最为常规的方案,以前都采用该方案,主要实现原理也很简单:
对背景截图 —》 对截图bitmap进行高斯模糊图像处理 —》把处理后的bitmap作为背景展示
优点:方案简单,属于所有模糊等都是自己控制,控制灵活性大
缺点:因为截图,所以没办法搞成实时模糊,实现功能修改逻辑较多

方案2 这个是新版本android才有的自带方法,它的实现原理,对某一个window进行flag的设置,如果设置了FLAG_BLUR_BEHIND,那么它后面的window层就会被设置成模糊,属于surfaceflinger层面实现了,在渲染时候layer处理,这个模糊属于实时的,即后面画面哪怕在动,高斯模糊也跟着动
优点:属于系统提供的接口相关,简单设置即可以,不需要自己额外操作,可以实时模糊

缺点:因为操作对象是window,只是窗口下面的会被模糊,导致一些窗口切换场景可能会有bug
下面我们就来重点介绍一下

3、重点介绍新方案2 FLAG_BLUR_BEHIND 使用

frameworks/base/core/java/android/view/WindowManager.java

   /** Window flag: enable blur behind for this window. */
    public static final int FLAG_BLUR_BEHIND        = 0x00000004;

这个FLAG_BLUR_BEHIND属于LayoutParams
在这里插入图片描述

注释就是说FLAG_BLUR_BEHIND就会让在该window下面的window进行模糊
具体如果要使用:
其实就是对window的LayoutParams设置这个flag

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
                WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

同时还有另一个方法setBlurBehindRadius

 public void setBlurBehindRadius(@IntRange(from = 0) int blurBehindRadius) {
            mBlurBehindRadius = blurBehindRadius;
        }

大家都知道高斯模糊都有一个模糊滤镜,这代表模糊的程度,一般mBlurBehindRadius越大模糊层度越厉害。代码如下:

 @Override
    protected void onResume() {
        super.onResume();
        
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
                WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
        getWindow().getAttributes().setBlurBehindRadius(100);//设置大一点为100,看的明显
    }

模糊前后效果对比如下:
模糊前:
在这里插入图片描述

模糊后:
在这里插入图片描述

4、原理源码分析

设置了FLAG_BLUR_BEHIND后,最后在WindowState会进行读取和相关业务处理:
frameworks/base/services/core/java/com/android/server/wm/WindowState.java


    private boolean shouldDrawBlurBehind() {
        return (mAttrs.flags & FLAG_BLUR_BEHIND) != 0
            && mWmService.mBlurController.getBlurEnabled();
    }

然后在applyDims方法中根据这个进行相关的执行:


    private void applyDims() {
        if (!mAnimatingExit && mAppDied) {
            mIsDimming = true;
            getDimmer().dimAbove(getSyncTransaction(), this, DEFAULT_DIM_AMOUNT_DEAD_WINDOW);
        } else if (((mAttrs.flags & FLAG_DIM_BEHIND) != 0 || shouldDrawBlurBehind())
                   && isVisibleNow() && !mHidden) {
            // Only show the Dimmer when the following is satisfied:
            // 1. The window has the flag FLAG_DIM_BEHIND or blur behind is requested
            // 2. The WindowToken is not hidden so dims aren't shown when the window is exiting.
            // 3. The WS is considered visible according to the isVisible() method
            // 4. The WS is not hidden.
            mIsDimming = true;
            final float dimAmount = (mAttrs.flags & FLAG_DIM_BEHIND) != 0 ? mAttrs.dimAmount : 0;
            final int blurRadius = shouldDrawBlurBehind() ? mAttrs.getBlurBehindRadius() : 0;
            getDimmer().dimBelow(getSyncTransaction(), this, dimAmount, blurRadius);
        }
    }

下面来看这个 getDimmer().dimBelow方法执行:

 void dimBelow(SurfaceControl.Transaction t, WindowContainer container, float alpha,
                  int blurRadius) {
        dim(t, container, -1, alpha, blurRadius);//调用dim方法
    }
      private void dim(SurfaceControl.Transaction t, WindowContainer container, int relativeLayer,
            float alpha, int blurRadius) {
        final DimState d = getDimState(container);//这里比较关键需要创建对应EffectLayer

        if (d == null) {
            return;
        }

        if (container != null) {
            // The dim method is called from WindowState.prepareSurfaces(), which is always called
            // in the correct Z from lowest Z to highest. This ensures that the dim layer is always
            // relative to the highest Z layer with a dim.
            t.setRelativeLayer(d.mDimLayer, container.getSurfaceControl(), relativeLayer);
        } else {
            t.setLayer(d.mDimLayer, Integer.MAX_VALUE);
        }
        t.setAlpha(d.mDimLayer, alpha);
        t.setBackgroundBlurRadius(d.mDimLayer, blurRadius);//对这个图层进行BlurRadius设置

        d.mDimming = true;
    }

这里来重点看看getDimState看看是怎么创建的:

 /**
     * Retrieve the DimState, creating one if it doesn't exist.
     */
    private DimState getDimState(WindowContainer container) {
        if (mDimState == null) {
            try {
                final SurfaceControl ctl = makeDimLayer();//这里又调用makeDimLayer创建
                mDimState = new DimState(ctl);
                /**
                 * See documentation on {@link #dimAbove} to understand lifecycle management of
                 * Dim's via state resetting for Dim's with containers.
                 */
                if (container == null) {
                    mDimState.mDontReset = true;
                }
            } catch (Surface.OutOfResourcesException e) {
                Log.w(TAG, "OutOfResourcesException creating dim surface");
            }
        }

        mLastRequestedDimContainer = container;
        return mDimState;
    }
  private SurfaceControl makeDimLayer() {
        return mHost.makeChildSurface(null)
                .setParent(mHost.getSurfaceControl())//这里host就是我们activity的task
                .setColorLayer()//注意是这种类型的layer
                .setName("Dim Layer for - " + mHost.getName())
                .setCallsite("Dimmer.makeDimLayer")
                .build();
    }

上面代码层面分析后,来看看SurfaceFlinger相关图层有啥变化
在这里插入图片描述

使用Android原生制作毛玻璃效果图片 毛玻璃效果,也被称为模糊效果,是许多现代应用中流行的一种视觉效果。在 Android 中,我们可以通过多种方式实现该效果。本文将探讨如何使用 Android 原生的 Bitmap 类和 RenderScript 来实现毛玻璃效果。 阅读详情

相关推荐

Android 弹窗毛玻璃背景实践

Android 弹窗毛玻璃背景实践 需求: 点击FloatingActionButton弹出弹层,弹层底部有多个图标可选,每一个图标都是一个功能入口,背景采用毛玻璃模糊效果。 记录一下这个需求的思考和实现过程。 查找Android原生API做法 在Android API里面,有个FLAG_BLUR_BEHIND用于模糊背景的FLAG,尝试一下使用它来做Dialog的背景模糊。 代码如...

苦逼程序员的笔记 6837

Android12窗口模糊(一)在Activity和Dialog中实现高斯模糊效果

介绍Android12如何实现高斯模糊的效果

AfinalStone的专栏 2万+

Android 窗口模糊处理

在 Android 12 中,我们提供了一些用于实现窗口模糊处理效果(例如背景模糊处理和模糊处理后方屏幕)的公共 API。窗口模糊处理或跨窗口模糊处理用于模糊处理给定窗口后方的屏幕。有两种窗口模糊处理方式,可用于实现不同的视觉效果:背景模糊处理:可用于创建具有模糊背景的窗口,创造出磨砂玻璃效果。模糊处理后方屏幕:可用于模糊处理(对话框)窗口后方的整个屏幕,创造出景深效果。仅背景模糊处理 (a)、仅模糊处理后方屏幕 (b)、背景模糊处理和模糊处理后方屏幕 (c)

华南烹鱼宴 5684

aosp13/14/15/16如何实现窗口局部区域高斯模糊毛玻璃效果及Winscope原生重大bug发现

以前高斯模糊原理也分析过,知道是在SurfaceFlinger触摸绘制时候进行的高斯模糊,那么再来分析一下高斯模糊相关实现时候是否有相关区域设置参数,从而反推出相关接口。简单说学员就是想实现对状态栏等区域局部进行高斯模糊,以前方案是针对窗口layer所有进行模糊,那么是否可以实现窗口的局部高斯模糊呢?但是上面分享模糊都是针对整个窗口进行的,就是桌面窗口设置一下后面窗口进行模糊的标志位,然后针对桌面窗口后面的壁纸窗口进行整体模糊。那么接下来要去探索aosp原生系统是否有接口支持局部高斯模糊呢?

learnframework的博客 871

Android 9.0 Launcher3单层高斯模糊(毛玻璃)效果的实现

在9.0的系统rom定制化开发,进行系统Laucher3定制中,在产品开发中有功能需求要求实现高斯模糊(毛玻璃)效果背景效果,在Launcher3中也是常见的功 能这就需要了解Workspace的背景定义,然后对背景实现高斯模糊功能,首选要分析加载流程,然后对其背景进行高斯模糊就可以了

安卓兼职framework和app工程师的博客 1037

Android应用实现高斯模糊背景功能

高斯模糊是一种常用的图像处理技术,可以将图像变得模糊,创建出一种柔和的效果。在Android应用开发中,我们可以使用高斯模糊效果来实现各种吸引人的用户界面设计。在这段代码中,我们首先获取根布局的引用,然后使用Blurry库对其进行高斯模糊处理。最后,我们将处理后的图像设置到一个ImageView中,以实现模糊背景的显示效果。接下来,我们需要在Java代码中实现高斯模糊效果。注意:为了让代码正常运行,请确保将背景图片添加到项目的drawable文件夹中,并在布局文件和Java代码中正确引用背景图片的名称。

2301_79326510的博客 1355

Android自定义可移动悬浮窗,WindowManager.LayoutParams一些属性介绍

效果图桌面浮窗权限申请<usespermission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 此 权限6.0以上在清单文件注册没有效果,测试一下,就是动态申请权限也不能申请成功,只能用户手动开启,开启方法 if (Build.VERSION.SDK_INT >= 23) { if (!Settin

Andy_l1的博客 7229

Android实现高斯模糊背景

总结一下,本文介绍了如何在Android应用中实现高斯模糊的背景效果。通过引入相关的依赖库,并使用Blurry库的API,我们可以轻松地将背景图片实现高斯模糊处理,并美化应用的界面。然后,借助Blurry库的API对背景图片进行高斯模糊处理,并将处理后的图片设置为背景容器的背景。上述依赖库中,palette-v7用于提取图片的主题色以便做适当的调整,而blurry则是用于实现高斯模糊效果的库。需要注意的是,以上代码仅为实现高斯模糊背景的关键部分,你还可以在背景容器中添加其他布局元素来完成完整的界面设计。

ByteWhizX的博客 1029

Android中毛玻璃效果的两种实现Android12及以前版本

方法1 先将图片缩小,然后放大图片,再设置为控件背景以达到更模糊的效果,同时也提升模糊算法的处理效率。对比下来同样的模糊半径 ,方法1 的模糊效果更好,且方法1 的模糊半径可以设置范围更大。2.使用Android自带类RenderScript 实现。Android中毛玻璃效果主要有两种实现方式。3.FastBlurUtil.java 类。1.使用JAVA算法FastBlur实现。2.BitmapUtil.java 类。方法2 模糊半径只能设置1-25。1.activity中调用。

kk3087961的博客 3290

Android 系统状态栏中实现高斯模糊背景

至此,我们已经完成了在 Android 系统的 SystemUI 中实现高斯模糊背景的过程。通过以上的布局和代码修改,我们可以在状态栏中看到具有高斯模糊效果的背景。同时,为了在不同版本的 Android 系统上适配高斯模糊效果,可能需要进行一些额外的代码调整和兼容性处理。希望本文能够帮助你理解如何在 Android 系统的 SystemUI 中实现高斯模糊背景,并通过提供的源代码进行相应的开发和调试。首先,我们需要在 SystemUI 的布局文件中添加一个用于展示高斯模糊背景的视图。属性来开启模糊效果。

CyberSparkZ的博客 870

常见的十大量化投资策略(附源码)

量化投资策略是利用量化的方法,进行金融市场的分析、判断和交易的策略、算法的总称。著名的量化投资策略有以下10种(注:策略源码模板不能直接用于实盘交易,仅供探讨交流) 01、海龟交易策略 海龟交易策略是一套非常完整的趋势跟随型的自动化交易策略。这个复杂的策略在入场条件、仓位控制、资金管理、止损止盈等各个环节,都进行了详细的设计,这基本上可以作为复杂交易策略设计和开发的模板。 海龟交易策略源码:https://www.myquant.cn/docs/python_strategyies/110 0.

小壁虎的春天 2万+

推荐一款神奇的Android背景模糊库:BlurBehind

推荐一款神奇的Android背景模糊库:BlurBehind 在Android应用开发中,我们经常追求创新和独特的用户体验,其中一种效果就是模糊背景。为了实现这一效果,你可能需要在API级别14以下的设备上寻找解决方案,因为FLAG_BLUR_BEHIND在这些设备上已不再支持。但是不用担心,今天我要向你推荐一个开源项目——BlurBehind,它能帮你轻松实现跨版本的背景模糊效果。 项目介绍 B...

gitblog_00054的博客 937

用逻辑分析仪实测EM4095:125kHz RFID耳标解码的电压与脉宽玄学

本文通过逻辑分析仪实测EM4095芯片,深入解析125kHz RFID耳标解码中的电压与脉宽关联现象。揭示了供电电压对曼彻斯特编码脉宽的影响规律,并提供了一套可落地的调试方法论,包括信号链路解析、逻辑分析仪配置技巧及系统级稳定性提升方案,帮助开发者解决解码不稳定问题。

weixin_30629653的博客 328

android dialog背景模糊化效果

最近做项目有这样的需求: 在activity中启动一个dialog时, 启动的dialog的背景设为启动acitivity的模糊化图片.实现思路: 1. 截屏, 获取当前activity的界面 2. 将获取的照片进行模糊化 3. 将模糊化的图片设为dialog的背景1.截屏, 获取当前activity的界面 private Bitmap takeScreenShot(Activity a

lbcab的博客 1万+

iOS 取证窍门:为什么要先从 Recovery 恢复模式开始?

未记录的 DFU 代表“设备固件升级”。与专为普通用户设计的恢复模式不同,DFU 模式从来都不是为公众设计的。Apple 知识库中的任何地方都没有关于 DFU 的文档。进入 DFU 的方法主要是通过按下、按住和释放按钮的复杂操作序列,并具有精确的时间限制。在多个步骤中的任何一个步骤中,如果时间错误,都会导致重新启动设备,而不是将其切换到 DFU。另外,设备屏幕上也没有 DFU 模式的指示。如果设备成功切换到 DFU,显示屏将保持黑色。即使对于专家来说,进入 DFU 模式也可能很困难。恢复模式是最容易解释的。

2302_82041293的博客 1198

半导体AMHS系统振动控制技术演进:从0.5G到超低振动的工艺革命

在半导体制造进入埃米级时代后,AMHS的振动控制能力将成为区分厂商技术等级的标尺。国内企业通过“弹性机械设计-混合主动控制-智能调度”的三重创新,正逐步突破0.2G阈值,支撑12英寸晶圆厂向3nm/2nm制程升级。未来,振动抑制不再仅是物流系统的性能参数,而是与光刻、刻蚀等核心工艺深度耦合的基础能力,这将重塑半导体设备产业的竞争格局。

m0_60674045的博客 1584

Android中毛玻璃效果的实践

设置为 true 时,窗口将是半透明的,窗口后面的内容也将是可见的。设置为 false 时,窗口将是不透明的,窗口后面的内容将不可见。通过以上尝试,可以判断出activity对接组件dialog毛玻璃不生效,跟使用的主题有较大关系,但是首页被透明显示的问题未查到根本原因,只知道与。可以实现模糊度效果,但是存在致命问题:Activity弹出后,MainActivity直接被透明了,看到了桌面。可是避免方案1的问题,但是模糊度没办法做到和组件一样,只能通过调节模糊比例,做到近似效果。:Activity利用。

u011835956的专栏 2605

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow)

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow) 包含所有数据和代码,支持一键运行(jupyter)

qq_40999533的博客 1485

android 玻璃背景,Android 弹窗毛玻璃背景实践

Android 弹窗毛玻璃背景实践需求: 点击FloatingActionButton弹出弹层,弹层底部有多个图标可选,每一个图标都是一个功能入口,背景采用毛玻璃模糊效果。记录一下这个需求的思考和实现过程。查找Android原生API做法在Android API里面,有个FLAG_BLUR_BEHIND用于模糊背景的FLAG,尝试一下使用它来做Dialog的背景模糊。 代码如下:final Dia...

weixin_39639040的博客 1716

芯片设计中的“隐形杀手”:手把手教你理解并优化互连寄生参数(以SPEF/DSPF为例)

本文深入探讨了芯片设计中互连寄生参数的影响及优化策略,特别关注SPEF/DSPF文件解析与静态时序分析。通过实际案例展示了耦合电容对时序收敛的关键影响,并提供从定位到优化的完整解决方案,助力工程师应对先进工艺下的设计挑战。

weixin_30687051的博客 598

vxWorks下dosFs文件系统的创建

文件系统,是指操作系统根据目录和文件的组织形式在磁盘设备上应用的一种设备驱动,不同的文件系统对目录和文件有不同的限制(如目录名限制,文件大小限制等)。VxWorks支持多种文件系统,比较重要的有:1、dosFs:适用于块存取设备(比如硬盘、软盘),和MS-DOS文件系统兼容;2、rawFs:提供了一种简单的原始文件系统。该文件系统将整个硬盘当作一个单独的大文件;3、cdromFs:允许系统从按照I

技术联盟 1万+

Android_模糊背景

实现简单的高斯模糊效果 此文章参考了大神的博客:http://blog.youkuaiyun.com/wl9739/article/details/51955598。 先上效果图: 首先,我们新建一个android空项目,命名为:BlurbackGround 既然是模糊背景,首先肯定就需要一张背景图,所以我们在网上随便找一张背景图下载下来,然后复制到drawable文件夹下,图片命名为:bg_bl...

qq_37181771的博客 3578

【UG\NX二次开发】使用内部函数展开和折叠工序导航器

NX二次开发-群精选」专栏收录了那些曾散落在聊天对话框里的精彩的知识分享,这都是被遗落的宝贵财富。让我们一起向大佬学习,充满激情地进步,不断超越自己。底部联系方式,欢迎您加入一起交流。​下次一定。

王牌飞行员_里海的博客 820
上一篇: 车机CarLauncher的Activity多屏模式WindowingMode为WINDOWING_MODE_MULTI_WINDOW疑问解析
下一篇: aosp11/12/13 壁纸高斯模糊,毛玻璃SurfaceFlinger层面原理-第二节千里马framework实战
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值