Android中毛玻璃效果的实践

2024-03-03 10:20

本文主要是介绍Android中毛玻璃效果的实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题背景:需要在一个Activity内实现一个dialog,并让dialog周围的半透明遮罩变为高斯模糊效果。正常接入组件库后,TV上面未出现高斯模糊效果

实际尝试的方案(方案1和2为Activity内直接写布局,方案3为空activity加载组件弹窗):
方案1:Activity利用

	<item name="android:windowIsTranslucent">false</item><item name="android:colorBackground">@android:color/transparent</item>

可以实现模糊度效果,但是存在致命问题:Activity弹出后,MainActivity直接被透明了,看到了桌面

方案2:利用

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">?attr/colorPrimarySurface</item> 		

可是避免方案1的问题,但是模糊度没办法做到和组件一样,只能通过调节模糊比例,做到近似效果

方案3:直接在activity内对接公共组件库dialog,目前在TV上无法实现高斯模糊效果
通过修改activity主题后,
使用方案1主题,可实现毛玻璃效果,但出现的问题与方案1一致
使用方案2主题,无毛玻璃效果

通过以上尝试,可以判断出activity对接组件dialog毛玻璃不生效,跟使用的主题有较大关系,但是首页被透明显示的问题未查到根本原因,只知道与

<item name="android:colorBackground">@android:color/transparent</item>

这个属性设置有很大关系

方案2实现方式:

    override fun onCreate(savedInstanceState: Bundle?) {lifecycle.addObserver(BackgroundBlurUtil(window))super.onCreate(savedInstanceState)}
class BackgroundBlurUtil(private var window: Window?,private val mBackgroundBlurRadius: Int = 20,    //窗口背景高斯模糊程度,数值越高越模糊且越消耗性能private val mBlurBehindRadius: Int = 20,        //窗口周边背景高斯模糊程度private val mDimAmountWithBlur: Float = 0f,    //根据窗口高斯模糊功能是否开启来设置窗口周边暗色的程度
): DefaultLifecycleObserver {override fun onCreate(owner: LifecycleOwner) {super.onCreate(owner)initBlur()}override fun onDestroy(owner: LifecycleOwner) {super.onDestroy(owner)window = null}/*** 更新窗口的高斯模糊效果*/private fun updateWindowForBlurs() {//设置背景模糊程度if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {LogUtils.d("BackgroundBlurUtil", "updateWindowForBlurs")window?.setBackgroundBlurRadius(mBackgroundBlurRadius)//设置背景周边模糊程度window?.attributes?.blurBehindRadius = mBlurBehindRadius//调整背景周边昏暗的程度window?.setDimAmount(mDimAmountWithBlur)//让上面的高斯模糊效果生效window?.attributes = window?.attributes}}/*** 设置一个窗口视图状态监听者,监听窗口视图是否可见以便是否更新窗口模糊的状态*/private fun setupWindowBlurListener(){val windowBlurEnabledListener = Consumer { _: Boolean? ->updateWindowForBlurs()}window?.decorView?.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener{override fun onViewAttachedToWindow(v: View) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {window?.windowManager?.addCrossWindowBlurEnabledListener(windowBlurEnabledListener)}}override fun onViewDetachedFromWindow(v: View) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {window?.windowManager?.removeCrossWindowBlurEnabledListener(windowBlurEnabledListener)}}})}private fun initBlur(){window?.run {//允许背景模糊,也可以通过样式属性R.attr#windowBlurBehindEnabled来实现addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND)// 允许背景变暗,也可以通过样式属性R.attr#backgroundDimEnabled来实现addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)}// 高斯模糊监听setupWindowBlurListener()}
}

关于主题:
继承基础主题后,实现如下两个属性:

<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">?attr/colorPrimarySurface</item>

主题属性介绍:
windowIsTranslucent:
windowIsTranslucent 通常用于创建半透明的对话框或菜单,是控制窗口是否半透明。 设置为 true 时,窗口将是半透明的,窗口后面的内容也将是可见的。设置为 false 时,窗口将是不透明的,窗口后面的内容将不可见。
windowIsTranslucent 主题属性在 Android 4.0(API 14)及更高版本上可以生效,需要与 windowBackground 属性一起使用,windowBackground 属性用于指定窗口的背景颜色

还有另外一个方案:将windowIsTranslucent设置为false,但是设置colorBackground和windowBackground为透明,再设置布局中的背景色,但是这个方案出现了底层activity完全透明的现象,具体原因不得而知

	<item name="android:windowIsTranslucent">false</item><item name="android:colorBackground">@android:color/transparent</item>

参考:
Android12窗口模糊(一)在Activity和Dialog中实现高斯模糊效果
android13 FLAG_BLUR_BEHIND 壁纸高斯模糊,毛玻璃背景方案设计

这篇关于Android中毛玻璃效果的实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/769331

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

防近视护眼台灯什么牌子好?五款防近视效果好的护眼台灯推荐

在家里,灯具是属于离不开的家具,每个大大小小的地方都需要的照亮,所以一盏好灯是必不可少的,每个发挥着作用。而护眼台灯就起了一个保护眼睛,预防近视的作用。可以保护我们在学习,阅读的时候提供一个合适的光线环境,保护我们的眼睛。防近视护眼台灯什么牌子好?那我们怎么选择一个优秀的护眼台灯也是很重要,才能起到最大的护眼效果。下面五款防近视效果好的护眼台灯推荐: 一:六个推荐防近视效果好的护眼台灯的

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使