android中给view添加遮罩层

devtools/2024/9/22 18:17:53/

1.在 res 目录中添加 id :

<?xml version="1.0" encoding="utf-8"?>
<resources><item name="view_mask_id" type="id" />
</resources>

2.扩展方法:

/** 给一个 View 添加一层由 [res] 填充的遮罩层布局, 可通过 [isShowOrigin] 控制是否显示原始布局, 返回 [res] 填充后的布局. */
fun View?.addMask(@LayoutRes res: Int, isShowOrigin: Boolean = true): View? {this ?: run {Logs.w("addMask error! -----> view is null!")return null}val maskLayout = LayoutInflater.from(this.context).inflate(res, null, false)addMask(maskLayout, isShowOrigin)return maskLayout
}/** 给一个 View 添加一层 [maskLayout] 遮罩层布局, 可通过 [isShowOrigin] 控制是否显示原始布局. */
fun View?.addMask(maskLayout: View, isShowOrigin: Boolean = true) {this ?: run {Logs.w("addMask error! -----> view is null!")return}val parent = this.parent as? ViewGroupparent ?: run {Logs.w("addMask error! -----> parent is null!")return}val originLayout = thisval maskLayoutContainer = FrameLayout(originLayout.context)// 将原始布局替换为 container.originLayout.replaceWith(maskLayoutContainer)maskLayoutContainer.apply {val lp = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT)// 如果需要显示原始布局, 添加原始布局到 container 中.if (isShowOrigin) {maskLayoutContainer.addView(originLayout.apply { layoutParams = lp })}// 添加 mask 布局.maskLayoutContainer.addView(maskLayout.apply { layoutParams = lp })}originLayout.setTag(R.id.view_mask_id, maskLayoutContainer)
}/*** 移除遮罩层布局.*/
fun View?.removeMask() {this ?: let {Logs.w("removeMask error! -----> View is null!")return}val originLayout = thisval maskLayoutContainer = this.getTag(R.id.view_mask_id) as? ViewGroupmaskLayoutContainer ?: let {Logs.w("removeMask error! -----> maskLayout is null!")return}maskLayoutContainer.replaceWith(originLayout)
}/** 将 View 替换为 [res] 填充后的布局, 返回 [res] 填充后的布局. */
fun View?.replaceWith(@LayoutRes res: Int): View? {this ?: run {Logs.w("replaceWith error! -----> view is null!")return null}val replaceLayout = LayoutInflater.from(this.context).inflate(res, null, false)replaceWith(replaceLayout)return replaceLayout
}/** 将 View 替换为 [replaceView]. */
fun View?.replaceWith(replaceView: View) {this ?: run {Logs.w("replaceWith error! -----> view is null!")return}val parent = this.parent as? ViewGroupparent ?: run {Logs.w("replaceWith error! -----> parent is null!")return}val originView = thisval originViewIndex = parent.children.indexOf(originView)if (originViewIndex >= 0) {replaceView.id = originView.idparent.removeViewAt(originViewIndex) // 移除原始布局.replaceView.removeFromParent() // 添加之前, 先从父布局移除 replaceView.parent.addView(replaceView, originViewIndex, originView.layoutParams)} else {Logs.w("replaceWith error! -----> child index is $originViewIndex")}
}/** 将 View 从它的父布局移除. */
fun View?.removeFromParent() {this ?: run {Logs.w("removeFromParent error! -----> view is null!")return}val parent = this.parent as? ViewGroupparent ?: run {Logs.w("removeFromParent error! -----> parent is null!")return}parent.removeView(this)
}


http://www.ppmy.cn/devtools/34809.html

相关文章

一般显卡3d建模渲染够用吗?3d云渲染助力

3D建模和渲染对计算机硬件有较高要求&#xff0c;特别是显卡。显卡的性能直接影响渲染速度&#xff0c;低端和高端显卡在渲染效率上存在显著差异。对于追求快速渲染的用户&#xff0c;高端显卡是首选。那么&#xff0c;4050显卡是否能够满足3D建模渲染的需求呢?下面我们来探讨…

在高噪声环境下单通道语音增强如何提高自动语音识别(ASR)性能

深度学习技术的出现极大地提高了ASR系统的性能&#xff0c;但在高噪声环境下&#xff0c;特别是在资源受限或无法使用多通道麦克风阵列的场景下&#xff0c;如使用单通道SE前端的ASR性能提升仍面临较大挑战。这主要是由于单通道SE前端的非线性处理引入的处理失真。 1、语音识别…

leetcode刷题记录—二分

1 二分 33. 搜索旋转排序数组 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], ..., num…

GIS设计与开发课程设计(一)

环境&#xff1a;Windows10专业版 ArcGIS10.2 ArcEngine10.2 Visual Studio 2019 因每个人电脑版本和软件版本不同&#xff0c;运行的结果可能不同 系列文章&#xff1a; GIS设计与开发课程设计&#xff08;一&#xff09; GIS设计与开发课程设计&#xff08;二&#xff09;…

Python-VBA函数之旅-pow函数

目录 一、pow函数的常见应用场景 二、pow函数使用注意事项 三、如何用好pow函数&#xff1f; 1、pow函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、pow函数的常见应用场景 Py…

【Spring基础】关于Spring IoC的那些事

文章目录 一、如何理解IoC1.1 Spring IOC 概述1.2 IoC 是什么 二、Ioc 配置的方式2.1 xml 配置2.2 Java 配置2.3 注解配置 三、依赖注入的方式3.1 setter方式3.2 构造函数3.3 注解注入 小结 一、如何理解IoC 1.1 Spring IOC 概述 控制反转 IoC(Inversion of Control)是一种设计…

Vue 全局事件总线 消息的订阅与发布的详细介绍与使用

Vue 中的全局事件总线&#xff1a;实现组件间通信的便捷方式 在 Vue 应用程序中&#xff0c;组件之间的通信是非常常见的需求。有时候我们需要在不相关的组件之间传递数据或者触发某些操作&#xff0c;这时候全局事件总线就显得非常有用了。本文将介绍 Vue 中全局事件总线的基…

享销客荣获浙江省首席信息官协会“2023年度数字化优秀服务商”

近日&#xff0c;纷享销客凭借在数字化服务领域的卓越表现和深厚实力&#xff0c;与甲骨文、汉得、海通安恒、普元信息等知名企业共同荣获由浙江省首席信息官协会颁发的“2023年度数字化优秀服务商”称号。这一荣誉的获得&#xff0c;不仅是对纷享销客过去一年在数字化服务领域…