• 前言
    由于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 全屏悬浮窗适配(悬浮窗沉浸式)相关推荐

  1. Android全屏与透明状态栏

    前言 Android沉浸式与全屏是不一样的两种主题,接下来我们看看吧 Android实现全屏 通过主题属性来实现 <style name="FullScreenTheme"& ...

  2. Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮...

    Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮 前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP) ...

  3. android刘海屏之终极适配

    前言:作为安卓开发,也得承认苹果设计一直在引领潮流,所以自从 iPhone X 发布之后,"刘海屏" 就一直被热议,作为我自己必须先吐槽一下,真没觉得刘海屏好看.但是作为苦逼的开发 ...

  4. Android全屏显示

    Android全屏显示 一.获取状态栏和导航条的高度: 1. 获取状态栏的高度: public int getStatusBarHeight() {Resources resources = mAct ...

  5. android 全屏动画_如何创建全屏视频开幕动画

    android 全屏动画 View demo 查看演示 Download Source 下载源 In this in-depth tutorial we want to show you how to ...

  6. Android全屏中adjustResize的失效的解决方案 AndroidBug5497Workaround

    最近做项目中遇到Android全屏中adjustResize失效的问题,网上搜索了一堆后,基本上都是使用AndroidBug5497Workaround这个工具类,但是在实际使用中遇到软键盘不弹出时, ...

  7. Android全屏悬浮窗画布,使用WindowManager实现Android悬浮窗

    WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象. 每一个WindowMan ...

  8. Android 全面屏处理(适配挖孔屏、刘海屏) kotlin

    测试机: Android 11 的 Xiaomi MI MAX 3 Android 12 的 Xiaomi K40 Pro 测试方法: 1. 该方法在api30后提示已经过时 在onCreat()方法 ...

  9. Android 全屏显示设置

    日常开发中有些界面要求全屏显示,网上大部分教程一来就给你说什么什么几种方式设置(非异形屏还好,异形屏状态栏虽然不见了但是区域照样显示,这类教程只适用于非异形屏). 步骤如下(只测试过小米手机): 1. ...

最新文章

  1. ubuntu16.04安装opencv3.4.1教程
  2. 针对阿片类药物使用障碍的药物重定位
  3. 与其他CA合作签发证书 谷歌赛门铁克之争接近尾声
  4. 企业根CA方法客户机证书的解决方案,ISA2006系列之三十
  5. Android中的context
  6. 【后端过程记录】用flask搭建服务器作后端接收数据 将base64字符串码解码为可读取文件 载入训练好的模型进行预测
  7. dataframe输出某列的数据以及统计某列的取值种数+输出某行数据
  8. 2021牛客暑期多校训练营2 L-WeChat Walk(分块)
  9. 神奇的css3(2)动画
  10. Transformer新内核Synthesizer:低复杂度的attention代替点乘式的注意力机制
  11. ProxyToken:微软 Exchange 服务器中的认证绕过新漏洞,可窃取用户邮件
  12. Shell函数和正则表达式
  13. linux压缩zip下载,linux下wget下载文件到指定目录,解压zip文件,解压与压缩总结...
  14. 交互设计师眼中的需求分析
  15. 智能管家(原型)- 语音控制设备
  16. [Vuforia]二.3D物体识别
  17. 阿里软件资深架构师李战谈:开发者的人品问题
  18. 指纹支付 android 9,华为G9青春版怎么设置指纹功能? 华为G9指纹支付解锁的教程...
  19. android 蓝牙 自动扫描,android蓝牙扫描(简单
  20. 小姐姐拯救计划之我的NAS有ipv6域名之蛇皮操作

热门文章

  1. C++使用CFile类文件读写
  2. 常用密码的正则表达式
  3. 性能测试能力提升最终篇-全链路压测
  4. 打印机十大共性故障解决方案(转东转西)
  5. drools规则引擎动态配置规则
  6. 编程中遇到syntax error怎么解决?
  7. MIGO BAPI BAPI_GOODSMVT_CREATE 使用汇总
  8. 国内微博客前景黯淡的两个原因
  9. Kafka(生产者)
  10. 正交变换——来龙去脉