Android 全屏悬浮窗适配(悬浮窗沉浸式)
- 前言
由于Android 高版本的类型限制,如果我们使用WindowsManager 做悬浮窗,会被限制在当前窗口内容中。而当前窗口大小会限制在状态栏和导航栏之间,所以会导致悬浮窗沉浸不了状态栏。
高版本windowsmanager 限制 源码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//6.0+mParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;} else {mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;}/*** Window type: Application overlay windows are displayed above all activity windows* (types between {@link #FIRST_APPLICATION_WINDOW} and {@link #LAST_APPLICATION_WINDOW})* but below critical system windows like the status bar or IME.* <p>* The system may change the position, size, or visibility of these windows at anytime* to reduce visual clutter to the user and also manage resources.* <p>* Requires {@link android.Manifest.permission#SYSTEM_ALERT_WINDOW} permission.* <p>* The system will adjust the importance of processes with this window type to reduce the* chance of the low-memory-killer killing them.* <p>* In multi-user systems shows only on the owning user's screen.*/public static final int TYPE_APPLICATION_OVERLAY = FIRST_SYSTEM_WINDOW + 38;
上面注解简单描述的意思就是:
应用程序覆盖窗口显示在所有活动窗口之上 ,但是级别会低于状态栏和IME,所以,从这里我们可以看出,当我们使用type=TYPE_APPLICATION_OVERLAY, 是很难将窗口沉浸到状态栏上的。
那要怎么做呢?
高版本WindowManager 沉浸状态栏
创建WindowManager 和LayoutParams
WindowManager wManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
设置Params 参数
mParams.format = PixelFormat.TRANSLUCENT;// 支持透明//mParams.format = PixelFormat.RGBA_8888;l
// mParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 焦点mParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE// 加上这句话悬浮窗不拦截事件| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE| WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS| WindowManager.LayoutParams.FLAG_FULLSCREEN| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
注意看,这里有一句核心,WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
意思是,不受边界影响,可以超出窗口边界!!!
加载布局,设置布局沉浸~
View inflate = LayoutInflater.from(this).inflate(R.layout.view_widow_layout, null);ImageView imageView = inflate.findViewById(R.id.iv);imageView.setScaleType(ImageView.ScaleType.FIT_XY);RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) imageView.getLayoutParams();layoutParams.topMargin=-StatusBarUtils.getStatusBarHeight(this);imageView.setLayoutParams(layoutParams);wManager.addView(inflate, mParams);//添加窗口
核心: layoutParams.topMargin=-StatusBarUtils.getStatusBarHeight(this);
通过获取状态栏高度,设置布局的margin为负数达到超出边界刚好为状态栏的高度,从而达到沉浸式效果!!
最后附上获取状态栏高度
/*** 获取状态栏高度* @param context* @return*/public static int getStatusBarHeight(Context context) {Resources resources = context.getResources();int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");int height = resources.getDimensionPixelSize(resourceId);return height;}
Android 全屏悬浮窗适配(悬浮窗沉浸式)相关推荐
- Android全屏与透明状态栏
前言 Android沉浸式与全屏是不一样的两种主题,接下来我们看看吧 Android实现全屏 通过主题属性来实现 <style name="FullScreenTheme"& ...
- Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮...
Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮 前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP) ...
- android刘海屏之终极适配
前言:作为安卓开发,也得承认苹果设计一直在引领潮流,所以自从 iPhone X 发布之后,"刘海屏" 就一直被热议,作为我自己必须先吐槽一下,真没觉得刘海屏好看.但是作为苦逼的开发 ...
- Android全屏显示
Android全屏显示 一.获取状态栏和导航条的高度: 1. 获取状态栏的高度: public int getStatusBarHeight() {Resources resources = mAct ...
- android 全屏动画_如何创建全屏视频开幕动画
android 全屏动画 View demo 查看演示 Download Source 下载源 In this in-depth tutorial we want to show you how to ...
- Android全屏中adjustResize的失效的解决方案 AndroidBug5497Workaround
最近做项目中遇到Android全屏中adjustResize失效的问题,网上搜索了一堆后,基本上都是使用AndroidBug5497Workaround这个工具类,但是在实际使用中遇到软键盘不弹出时, ...
- Android全屏悬浮窗画布,使用WindowManager实现Android悬浮窗
WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象. 每一个WindowMan ...
- Android 全面屏处理(适配挖孔屏、刘海屏) kotlin
测试机: Android 11 的 Xiaomi MI MAX 3 Android 12 的 Xiaomi K40 Pro 测试方法: 1. 该方法在api30后提示已经过时 在onCreat()方法 ...
- Android 全屏显示设置
日常开发中有些界面要求全屏显示,网上大部分教程一来就给你说什么什么几种方式设置(非异形屏还好,异形屏状态栏虽然不见了但是区域照样显示,这类教程只适用于非异形屏). 步骤如下(只测试过小米手机): 1. ...
最新文章
- ubuntu16.04安装opencv3.4.1教程
- 针对阿片类药物使用障碍的药物重定位
- 与其他CA合作签发证书 谷歌赛门铁克之争接近尾声
- 企业根CA方法客户机证书的解决方案,ISA2006系列之三十
- Android中的context
- 【后端过程记录】用flask搭建服务器作后端接收数据 将base64字符串码解码为可读取文件 载入训练好的模型进行预测
- dataframe输出某列的数据以及统计某列的取值种数+输出某行数据
- 2021牛客暑期多校训练营2 L-WeChat Walk(分块)
- 神奇的css3(2)动画
- Transformer新内核Synthesizer:低复杂度的attention代替点乘式的注意力机制
- ProxyToken:微软 Exchange 服务器中的认证绕过新漏洞,可窃取用户邮件
- Shell函数和正则表达式
- linux压缩zip下载,linux下wget下载文件到指定目录,解压zip文件,解压与压缩总结...
- 交互设计师眼中的需求分析
- 智能管家(原型)- 语音控制设备
- [Vuforia]二.3D物体识别
- 阿里软件资深架构师李战谈:开发者的人品问题
- 指纹支付 android 9,华为G9青春版怎么设置指纹功能? 华为G9指纹支付解锁的教程...
- android 蓝牙 自动扫描,android蓝牙扫描(简单
- 小姐姐拯救计划之我的NAS有ipv6域名之蛇皮操作