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

相关文章

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http