当前位置: 首页 > news >正文

android之WindowManager悬浮框

文章目录

  • 阐述
  • 悬浮框的实现
  • AndroidManifest配置
  • 使用方法

阐述

Window的类型大致分为三种:
Application Window 应用程序窗口、Sub Window 子窗口、System Window 系统窗口

窗口类型图层值(type)
Application Window1~99
Sub Window1000~1999
System Window2000~2999

图层对应的type值越大,Z轴排序越靠前。

悬浮框的实现

主要代码如下所示:

    private void testWindowManager() {WindowManager windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();View view = LayoutInflater.from(mContext).inflate(R.layout.wm_test, null);// 设置图片的格式,效果为背景透明layoutParams.format = PixelFormat.RGBA_8888;// 如果x,y的值有效果,则需要设置LayoutParams.gravity属性layoutParams.x = 350;layoutParams.y = 50;// 布局宽高的设置,这里的值为px,如果需要使用dp则需要转化layoutParams.width = 200;layoutParams.height = 220;// 窗口显示的默认起始位置layoutParams.gravity = Gravity.TOP | Gravity.START;// 图层的类型layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;// FLAG_LAYOUT_IN_SCREEN 将窗口放置在整个屏幕中,忽略父窗口的任何约束。layoutParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;windowManager.addView(view, layoutParams);}

布局文件wm_test.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:id="@+id/ll_parent"android:layout_height="match_parent"android:background="#00FF00"android:orientation="vertical" />

AndroidManifest配置

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

1.如果应用是通过platform平台sign的,那么可以直接使用该特殊权限,系统默认是“允许显示在其他应用的上层”;
2.普通的应用是需要通过在设置中打开“允许显示在其他应用的上层”的开关才可正确显示悬浮框,主要的代码如下所示:

// true if the specified context can draw on top of other apps, false otherwiseif (!Settings.canDrawOverlays(mContext)) {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));startActivityForResult(intent, 1);}

使用方法

// 添加
public void addView(View view, ViewGroup.LayoutParams params);
// 更新
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
// 移除
public void removeView(View view);

相关文章:

  • C#面:C# 类的执行顺序?
  • [pmayavi][python]mayavi所有whl文件下载地址汇总
  • “探索未来之音:AI音乐创作的前沿技术与应用“
  • 安卓逆向案例——XX电影网
  • Ilya出走记:SSI的超级安全革命
  • Python面试宝典:Python中与常用的机器学习库相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)
  • 设置Docker容器开机自启
  • 硬件开发笔记(二十一):外部搜索不到的元器件封装可尝试使用AD21软件的“ManufacturerPart Search”功能
  • 动态规划:Leetcode 739. 每日温度
  • 【gdb 如何生成并查看core dump】
  • Gobject tutorial 九
  • C++ GPU编程(英伟达CUDA)
  • AVL许可证更新
  • 无需科学上网:轻松实现国内使用Coze.com平台自己创建的Bot(如何实现国内免费使用GPT-4o/Gemini等最新大模型)
  • jigdo无法下载的文件
  • 【技术性】Search知识
  • 230. Kth Smallest Element in a BST
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JavaScript函数式编程(一)
  • JavaScript类型识别
  • Java比较器对数组,集合排序
  • Java应用性能调优
  • MySQL主从复制读写分离及奇怪的问题
  • nfs客户端进程变D,延伸linux的lock
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Vue.js源码(2):初探List Rendering
  • vue总结
  • XML已死 ?
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 关于使用markdown的方法(引自CSDN教程)
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 聊聊hikari连接池的leakDetectionThreshold
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 移动端唤起键盘时取消position:fixed定位
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 第二十章:异步和文件I/O.(二十三)
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​queue --- 一个同步的队列类​
  • ​如何在iOS手机上查看应用日志
  • # linux 中使用 visudo 命令,怎么保存退出?
  • (3)STL算法之搜索
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (六)DockerCompose安装与配置
  • (论文阅读11/100)Fast R-CNN
  • (七)Flink Watermark
  • (一)80c52学习之旅-起始篇
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • .Family_物联网
  • .NET 5种线程安全集合
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET/C# 使窗口永不获得焦点
  • .NET建议使用的大小写命名原则
  • .Net接口调试与案例