ViewOverlay-加蒙层真的一种实现方式

news2024/11/25 15:40:17

一、ViewOverlay能实现什么?

    在Android中,ViewOverlay是一个特殊的视图层,可以在一个视图的上方添加和管理附加的视图层,而不会干扰原始视图的布局和交互。它提供了一种方便的方式来在运行时添加、移除或修改视图层,而无需修改原始布局。

二、基础用法

2.1 一个简单案例

比如我们想给一张图片加一张蒙层效果,蒙层颜色是#cc000000,那可以这样很简单的实现:

val imageView = findViewById<AppCompatImageView>(R.id.image_view)
val colorDrawable = ColorDrawable(Color.parseColor("#cc000000"))
button.setOnClickListener {
    // 完全盖住ImageView
    colorDrawable.setBounds(0, 0, imageView.measuredWidth, imageView.measuredHeight)
    imageView.overlay.add(colorDrawable)
}

原始图片效果:
在这里插入图片描述
添加蒙层效果:
在这里插入图片描述
移除蒙层效果:

imageView.overlay.remove(colorDrawable)

2.2 overlay.add(drawable)/groupOverlay.add(view)之后,不显示问题解决

2.2.1 add(Drawable)方法

    如果直接将Drawable对象添加到imageView.overlay.add()没有setBounds则会因为Drawable没有宽高而无法展示,宽高可能为0,需要主动调用setBounds指定drawable的宽高。

2.2.1 add(View)方法

    而对于add(View)来说(需要通过ViewGroup类型的容器对象getOverlay()),就需要给需要添加的view通过setLayoutParams的方式指定宽高才能展示。

注意View和ViewGroup的getOverlay方法实现的差异,是和ViewGroup有addView()而View没有是一样的道理。

  • ViewGroup->getOverlay()返回ViewGroupOverlay类型对象,能添加view的浮层,也能添加drawable
   @Override
    public ViewGroupOverlay getOverlay() {
        if (mOverlay == null) {
            mOverlay = new ViewGroupOverlay(mContext, this);
        }
        return (ViewGroupOverlay) mOverlay;
    }
  • View->getOverlay()返回ViewOverlay类型对象,无法addView(),只能添加drawable对象
    public ViewOverlay getOverlay() {
        if (mOverlay == null) {
            mOverlay = new ViewOverlay(mContext, this);
        }
        return mOverlay;
    }

    特别的如果添加TextView,因为不同字体、大小都会导致宽高不同,所以预先无法知道,这时候就需要StaticLayout.getDesiredWidth()方法获取文本需要的宽高,然后设置给TextView。
在这里插入图片描述
测试代码:

val tv = TextView(this)
tv.text = "是神仙姐姐呀~"
val desiredWidth = StaticLayout.getDesiredWidth(
    tv.text,
    tv.paint // 注意这里的画笔对象,要tv.getPaint(),否则可能测量值偏差较大
)
Log.d(TAG, "onCreate: desiredWidth = $desiredWidth")
tv.isSingleLine = true
tv.maxLines = 1
tv.layoutParams =
    ViewGroup.LayoutParams(desiredWidth.toInt(), ViewGroup.LayoutParams.WRAP_CONTENT)
// View的overlay对象是不能addView()的,这里从ImageView的父布局添加,仅为测试效果
(imageView.parent as? ViewGroup)?.addView(tv)

效果:
在这里插入图片描述

三、最后

    通过overlay方式添加view层级通过抓布局可以看到,原理其实也是增加了布局层次,但是操作比较简单高效。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/621845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python嵌入SEO

Python嵌入SEO Python是一种高级编程语言&#xff0c;由于其简单易学和广泛应用的特点&#xff0c;已经成为了许多工程师的首选语言。随着互联网发展的趋势&#xff0c;现代的SEO已经不再是简单的关键词填充和链接堆积&#xff0c;而是需要更复杂的优化方式&#xff0c;这时候…

Sentinel在k8s部署

一、Sentinel Dashboard在k8s部署 官方jar包下载 由于sentinel dashboard官方没有提供镜像下载&#xff0c;需从sentinel官方下载sentinel dashboard的jar包&#xff0c;这里选择1.8.0进行下载。注意与springboot版本的兼容性。 打镜像并上传自己镜像仓库 在自己项目中添加…

mac(M1)芯片安装Stable-diffusion-webui

背景&#xff1a;听同事说这个都是在GPU上跑的&#xff0c;cpu跑这个比较费劲。我本地mac跑这个&#xff0c;也是为了调试一些相关的插件和api。为了开发方便点。当然确实提吃内存的。 目录 一、Stable-diffusion-webui 项目地址和官方安装方式 二、自己的安装方式 2.1、更…

自定义注解,基于redis实现分布式锁

一、如何实现自定义注解 1.1、注解的基础知识 实现自定义注解其实很简单&#xff0c;格式基本都差不多。也就参数可能变一变。 Retention&#xff1a;取值决定了注解在什么时候生效&#xff0c;一般都是取运行时&#xff0c;也就是RetentionPolicy.RUNTIME。 Target&#xff…

Unreal5 第三人称射击游戏 射击功能实现2

上一篇我们实现了角色射击相关的动画以及切换逻辑&#xff0c;并将武器相关的模型添加到角色身上。 这一篇开始制作武器相关的功能。 制作子弹父类 首先创建一个actor类&#xff0c;命名为BP_Bullet&#xff0c;这个作为子弹的通用父类&#xff0c;在里面创建子弹通用的功能实…

测试相关知识

测试基础知识 1. 测试基本理念2. 软件测试的分类2.1 程序是否运行2.2 测试时间段划分2.3 是否涉及实现2.4 其它测试2.5 当前流程的测试概念 3. 测试设计方法4. 参考书籍 1. 测试基本理念 软件测试的定义&#xff1a;软件测试是使用人工或自动的手段来运行或测定某个软件系统的…

chatgpt赋能python:Python年龄换算:如何根据Python版本算出“年龄”?

Python年龄换算&#xff1a;如何根据Python版本算出“年龄”&#xff1f; Python是一种高级编程语言&#xff0c;享有强大、易读、易用和可扩展性等各种优点。它是许多开发者使用的首选语言&#xff0c;尤其在数据科学和机器学习领域中备受推崇。 但是&#xff0c;Python几乎…

网络安全工具合集

首先&#xff0c;恭喜你发现了宝藏。 本文章集成了全网优秀的开源攻防武器项目&#xff0c;包含&#xff1a; 信息收集工具&#xff08;自动化利用工具、资产发现工具、目录扫描工具、子域名收集工具、指纹识别工具、端口扫描工具、各种插件....etc...&#xff09; 漏洞利用…

轮廓检测及功能

目录 一、实验介绍二、实验步骤三、实验任务任务一&#xff1a;轮廓特征练习一: 找到每个轮廓的方向任务二&#xff1a;边界矩形练习二: 围绕轮廓裁剪图像 一、实验介绍 1. 实验内容 本实验将学习轮廓检测及功能。 2. 实验要点 生成二进制图像来查找轮廓找到并画出轮廓轮廓…

面试题--12

1.MySQL 的内连接、左连接、右连接有什么区别&#xff1f; 2.MySQL 索引是怎么实现的&#xff1f; 3.索引的优点和缺点—查询频率高的字段 4.B树的特点和作用----必须先看 下面的网址 5.什么是聚集索引和非聚集索引 6.索引的分类 7.什么是最左前缀法则以及如何设计最左法则 8.怎…

图论基础和表示

一、概念及其介绍 图论(Graph Theory)是离散数学的一个分支&#xff0c;是一门研究图(Graph)的学问。 图是用来对对象之间的成对关系建模的数学结构&#xff0c;由"节点"或"顶点"(Vertex&#xff09;以及连接这些顶点的"边"&#xff08;Edge&a…

chatgpt赋能python:Python开源免费——为什么它是SEO世界的最佳选择

Python开源免费——为什么它是SEO世界的最佳选择 介绍 Python是一种流行的程序设计语言&#xff0c;拥有众多的开源库和响应式社区。它广泛应用于机器学习、数据科学、Web开发、系统自动化等领域。Python不仅易于学习和使用&#xff0c;而且完全免费并且开源&#xff0c;使得…

Linux线程的同步与互斥(二) 条件变量+信号量

文章目录 二、线程同步条件变量1、条件变量的概念2、同步概念与竞态条件3、条件变量函数初始化4、条件变量函数销毁5、条件变量函数等待6、条件变量函数唤醒等待生产者消费者模型1、理论部分2、“3 2 1”原则3、基于阻塞队列的生产者消费者模型 POSIX信号量1、信号量的概念2、信…

时间序列学习 经典案例(5)【stability_selection】股票数据特征分析与特征选择

0.环境配置 本文用到的环境是&#xff1a; jupyter 略python 3.9stability_selection 略&#xff0c;见下文。scikit-learn 1.2.2seaborn 0.12.2pandas 1.3.5numpy 1.22.3matplotlib 3.6.3tushare 1.2.89baostock 00.8.80yfinance 0.2.18 1.stability_selection模块安装【问…

【MySQL数据库 | 番外篇】 聚合函数

前言&#xff1a; 聚合函数是分组查询中一个重要的组成部分&#xff0c;想要利用分组查询&#xff0c;就要对聚合函数有不错的掌握&#xff0c;因此我们在这里开一篇番外&#xff0c;讲解SQL语法中的聚合函数 聚合函数&#xff1a; 聚合函数是SQL中一种特殊的函数&#xff0c;…

大模型信息提取、文本生成、视觉语音应用

448页新书《基础模型自然语言处理》&#xff0c;详述大模型在信息提取文本生成视觉语音应用。 Dr. Gerhard Paa 等人合著的《Foundation Models for Natural Language Processing》 一书系统介绍基础模型研究和应用的全面概述&#xff0c;而且是目前对此方面研究最新的综述。 …

【Java】Java核心要点总结:59

文章目录 1. 线程的run()和start()有什么区别&#xff0c;为什么不直接调用run()2. synchronized是什么&#xff0c;以及原理3. Java中如何实现多线程的通讯和协作4. Volatile有什么特点&#xff0c;为什么能够保证变量的可见性5. 为什么说synchronized是一个悲观锁&#xff0c…

chatgpt赋能python:Python开发环境的下载方法

Python开发环境的下载方法 Python是一种高级的编程语言&#xff0c;受到广泛的社区和商业支持。它用于数据分析、人工智能和Web开发等领域&#xff0c;成为业界最流行的编程语言之一。搭建Python开发环境需要安装解释器、编辑器、包管理器和库&#xff0c;下面介绍Python开发环…

chatgpt赋能python:用Python开发在线电影播放网站如何进行SEO

用Python开发在线电影播放网站如何进行SEO 随着人们对于电影、电视剧等视频娱乐的需求日益增长&#xff0c;越来越多的在线电影播放网站涌现出来。作为开发者&#xff0c;如何通过搜索引擎优化&#xff08;SEO&#xff09;来使你的在线电影播放网站具有更好的可见度&#xff0…

chatgpt赋能python:如何更新Python库?

如何更新Python库&#xff1f; Python语言已经成为现代编程语言中最受欢迎的一种&#xff0c;它的成功归功于它的灵活性、简洁性和可读性。Python库是它成功的关键&#xff0c;这些库是程序员的基本工具箱&#xff0c;可以更快地编写、测试和部署程序。 然而&#xff0c;Pyth…