Android WindowManager工具类

WindowManager提供三个方法: addView()、updateLayout()、removeView()。分别对应是添加view、更新view、移除view。

    <!--悬浮窗权限--><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

WindowManagerUtil 

package cn.jzvd.demo.utils;import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.PixelFormat;
import android.hardware.display.DisplayManager;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;import java.util.ArrayList;
import java.util.Collection;
import java.util.List;/*** 注意申请悬浮窗权限*/
public class WindowManagerUtil {private final String TAG = "GuiViewManager";private final List<WindowBean> mWindowBeans = new ArrayList<>();private static volatile GuiViewManager mInstance = null;private WindowBean mPreWindowBean;private Context mContext = null;private int mType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;public void init(Context context) {mContext = context;createWindowManager();}public void setWindowType(int windowType) {mType = windowType;}private WindowManagerUtil() {}public static WindowManagerUtil getInstance() {if (mInstance == null) {synchronized (WindowManagerUtil.class) {if (mInstance == null) {mInstance = new WindowManagerUtil();}}}return mInstance;}/*** 获取WindowManager** @return*/private void createWindowManager() {try {Display[] displays = ((DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE)).getDisplays();LogUtil.d(TAG,"displays.length " + displays.length);//displays.length<2说明只有一个屏幕if (null != displays) {for (Display display : displays) {Context context = mContext.createDisplayContext(display);WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();windowManager.getDefaultDisplay().getMetrics(outMetrics);WindowManager.LayoutParams lp = new WindowManager.LayoutParams();lp.type = mType;lp.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;//lp.width = WindowManager.LayoutParams.MATCH_PARENT;//lp.height = WindowManager.LayoutParams.MATCH_PARENT;lp.format = PixelFormat.TRANSPARENT;//将alpha设置为最大遮挡不透明度//lp.alpha = 0.8f;lp.gravity = Gravity.TOP | Gravity.START;mWindowBeans.add(new WindowBean(display.getDisplayId(), windowManager, lp));}}} catch (Exception e) {LogUtil.e(TAG,"createWindowManager  error " + e);}}/*** 获取状态栏高度** @return*/private int getStatusBarHeight() {int statusBarHeight = -1;//获取status_bar_height资源的ID@SuppressLint("InternalInsetResource")int resourceId = mContext.getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {//根据资源ID获取响应的尺寸值statusBarHeight = mContext.getResources().getDimensionPixelSize(resourceId);}return statusBarHeight;}public void show(View view, int width, int height, int startX, int startY) {//目前不考虑两个屏幕,在只有一个屏幕的情况下,displayId为0show(0, view, width, height, startX, startY);}public void show(int displayId, View view, int width, int height, int startX, int startY) {LogUtil.d(TAG, "show width " + width +" height " +height + " startX " + startX +" startY " +startY );try {WindowBean windowBean = getWindowBean(displayId);if (windowBean != null) {WindowManager windowManager = windowBean.getWindowManager();WindowManager.LayoutParams lp = windowBean.getLp();if (windowManager != null && lp != null) {dismiss();lp.x = startX;lp.y = startY;lp.width = width;lp.height = height;lp.type = mType;windowManager.addView(view, lp);windowBean.setView(view);mPreWindowBean = windowBean;}}} catch (Exception e) {LogUtil.e(TAG, "show error ", e);}}public void dismiss() {if (mPreWindowBean != null) {WindowManager windowManager = mPreWindowBean.getWindowManager();View view = mPreWindowBean.getView();if (windowManager != null && view != null) {windowManager.removeView(view);}mPreWindowBean = null;}}public WindowBean getWindowBean(int displayId) {if (isEmptyArray(mWindowBeans)) {createWindowManager();}for (WindowBean windowBean : mWindowBeans) {if (displayId == windowBean.getDisplayId()) {return windowBean;}}return null;}private boolean isEmptyArray(Collection list) {return list == null || list.isEmpty();}public void destroy() {mWindowBeans.clear();mContext = null;}
}

WindowBean 

public class WindowBean {private int displayId;private WindowManager windowManager;private WindowManager.LayoutParams lp;private View view;public WindowBean(int displayId, WindowManager windowManager, WindowManager.LayoutParams lp) {this.displayId = displayId;this.windowManager = windowManager;this.lp = lp;}public int getDisplayId() {return this.displayId;}public WindowManager getWindowManager() {return this.windowManager;}public WindowManager.LayoutParams getLp() {return this.lp;}public View getView() {return this.view;}public void setView(View view) {this.view = view;}
}

其他工具类大家搜索一个就可以了。

推荐几个:

浮窗中addView()不显示 分析思路_android windowmanager addview后窗口不显示-CSDN博客

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

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

相关文章

Linux-3 yum和vim

目录 本节目标&#xff1a; Linux 软件包管理器 yum 什么是软件包 1.yum是什么&#xff1f;软件包&#xff1f; 2.Linux(centos)的生态 3.yum的相关操作 我怎么知道我应该安装什么软件&#xff1f; 4.yum的本地配置 关于 rzsz 查看软件包 Linux编辑器-vim使用 1.v…

【Go】goroutine并发常见的变量覆盖案例

越过山丘 遇见六十岁的我 拄着一根白手杖 在听鸟儿歌唱 我问他幸福与否 他笑着摆了摆手 在他身边围绕着一群 当年流放归来的朋友 他说你不必挽留 爱是一个人的等候 等到房顶开出了花 这里就是天下 总有人幸福白头 总有人哭着分手 无论相遇还是不相遇 都是献给岁月的序曲 …

Github 2024-03-30 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目2C项目1Jupyter Notebook项目1Go项目1非开发语言项目1Mojo项目1开源 iOS 应用合作列表 创建周期:3351 天协议类型:…

ubuntu18.04安装qt

ubuntu18.04安装qt 1、下载文件 比如我下载的是5.13.0版本 下载链接 2、安装 wget https://download.qt.io/archive/qt/5.13/5.13.0/qt-opensource-linux-x64-5.13.0.runsudo chmod x qt-opensource-linux-x64-5.13.0.runsudo ./qt-opensource-linux-x64-5.13.0.run参考文…

数学分析复习:等价量的概念

本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 等价量 定义&#xff1a;无穷小量、无穷大量 若 lim ⁡ x → x 0 f ( x ) 0 \lim\limits_{x\to x_0}f(x)0 x→x0​lim​f(x)0&#xff0c;则称当 x → x 0 x\to x_0 x→x0​ 时&#xff0c; f ( x ) f(x) f(x) 是无…

开源知识库平台Raneto--使用Docker部署Raneto

文章目录 一、Raneto介绍1.1 Raneto简介1.2 知识库介绍 二、阿里云环境2.1 环境规划2.2 部署介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Raneto镜像五、部署Raneto知识库平台5.1 创建挂载目录5.2 编辑config.js文件5.…

MySQL InnoDB 之 多版本并发控制(MVCC)

多版本并发控制&#xff08;MVCC&#xff0c;Multi-Version Concurrency Control&#xff09;是数据库管理系统中用于提供高并发性和在事务处理中实现隔离级别的一种技术。MVCC 允许系统在不完全锁定数据库资源的情况下&#xff0c;处理多个并发事务&#xff0c;从而提高了数据…

Datacom HCIP笔记-OSPF协议 之二

链路&#xff1a;路由器之间的相连的链路 状态&#xff1a;链路上的参数在某一时刻的状态 单边邻居 one way&#xff1f; 收到对端发来的hello报文&#xff0c;其中没有自己的router id LSA类型&#xff1a; 1类LSA&#xff1a;描述路由器自身加入到ospf进程中的直连链路的状态…

大数据-TXT文本重复行计数工具

支持系统类型&#xff1a;Windows 64位系统 Linux 64位系统 苹果64位系统 硬盘要求&#xff1a;固态硬盘&#xff08;有效剩余磁盘空间大小最低3倍于大数据文件的大小&#xff09; 内存要求&#xff1a;最低8G&#xff08;例如只有几百G数据&#xff09; 如果处理TB级大数据文…

STM32 软件I2C方式读取AS5600磁编码器获取角度例程

STM32 软件I2C方式读取AS5600磁编码器获取角度例程 &#x1f516;本例程使用正点原子例程作为工程模板创建。 &#x1f4d8; 硬件电路部分 &#x1f33f;原理图部分&#xff1a; &#x1f33f;PCB布线和电路 ✨注意事项&#xff1a;有些硬件需要I2C上拉&#xff0c;否则检…

校园局域网钓鱼实例

Hello &#xff01; 我是"我是小恒不会java" 本文仅作为针对普通同学眼中的网络安全&#xff0c;设计的钓鱼案例也是怎么简陋怎么来 注&#xff1a;本文不会外传代码&#xff0c;后端已停止使用&#xff0c;仅作为学习使用 基本原理 内网主机扫描DNS劫持前端模拟后端…

HTTP和tcp的区别

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和TCP&#xff08;Transmission Control Protocol&#xff09;是互联网通信中的两个不同层次的协议&#xff0c;它们之间有着以下区别&#xff1a; 层次不同&#xff1a; TCP是传输层协议&#xff0c;负责在网络上可靠…

【2023】kafka入门学习与使用(kafka-2)

目录&#x1f4bb; 一、基本介绍1、产生背景2、 消息队列介绍2.1、消息队列的本质作用2.2、消息队列的使用场景2.3、消息队列的两种模式2.4、消息队列选型&#xff1a; 二、kafka组件1、核心组件概念2、架构3、基本使用3.1、消费消息3.2、单播和多播消息的实现 4、主题和分区4.…

大模型与数据分析:探索Text-to-SQL

当今大模型如此火热&#xff0c;作为一名数据同学&#xff0c;持续在关注LLM是如何应用在数据分析中的&#xff0c;也关注到很多公司推出了AI数智助手的产品&#xff0c;比如火山引擎数智平台VeDI—AI助手、 Kyligence Copilot AI数智助理、ThoughtSpot等&#xff0c;通过接入人…

Node.js的Event Loop:六个阶段详解

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

括号生成(回溯+剪枝)

22. 括号生成 - 力扣&#xff08;LeetCode&#xff09; 题目描述 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 样例输入 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))&q…

五年前端的面试之旅

哈喽我是树酱&#xff0c;最近整理了下前端面试相关的知识题库&#xff0c;借此分享给各位小伙伴&#xff0c;帮助小伙伴早日拿到钟意的offer&#xff01; 前言 最近就业市场不景气&#xff0c;跟大环境较差也有关&#xff0c;确实给我们也会带来一定的挑战。在招聘网站投简历的…

数据仓库的发展历程

数据仓库的概念可以追溯到20世纪60年代,但真正形成理论并被企业广泛应用还需要一个较长的发展过程。大致可以分为以下几个阶段: 决策支持系统(DSS)时期(1960s-1970s) 这一时期,随着管理信息系统(MIS)和电子计算机的兴起,企业开始尝试构建面向决策的数据处理系统。最初的决策支…

python批量转化pdf图片为jpg图片

1.把pdf图片批量转为jpg&#xff1b;需要注意的是&#xff0c;需要先安装poppler这个软件&#xff0c;具体安装教程放在下面代码中了 2.代码 #poppler安装教程参考&#xff1a;https://blog.csdn.net/wy01415/article/details/110257130 #windows上poppler下载链接&#xff1a…

从零开始机器学习(机器学习 监督学习之线性回归 损失函数及可视化 梯度下降 线性回归的平方误差损失函数 lab实验)

文章目录 机器学习定义监督学习之线性回归损失函数及可视化梯度下降线性回归的平方误差损失函数lab实验 机器学习定义 机器学习就是机器通过不断训练数据集从逐渐知道正确的结果 机器学习包括监督学习和非监督学习 监督学习&#xff1a;需要输入数据和结果数据来不断训练学习…