安卓窗口window无法移除屏幕外超过屏幕边界?-wms源码层面深入剖析

news2024/11/17 23:59:07

背景

学习了上一节的窗口位置变化相关的内容后,在窗口移动过程过程中发现有一个限制问题,大家可以看一下如下动态图:
在这里插入图片描述

已经尽力把窗口想要拖到屏幕外面,但是一直拖到不生效,只能在屏幕内部进行移动,这个到其实很奇怪,因为对于LayoutParam的x,y坐标是有进行设置的,为啥设置了就不生效呢?

这里看看是不是应用层面还是哪里限制了,可以通过wms的Relayout的Attribute属性看看,明显看到有负数坐标,即app层面已经把移除屏幕的x坐标传递到了wms,但是最后wms并没有让这个传递来的坐标生效。
在这里插入图片描述

分析为啥不可以超出屏幕边界

这里要分析就一样也要日志中开始分析
frameworks/base/core/java/android/view/WindowLayout.java
在这里插入图片描述
前面分析位置变化就这里Gravity.apply坐标就有了变化,这里我们看看日志:
在这里插入图片描述
可以看到这里的Gravity.apply执行完成后确实x方向坐标是负的,但是继续往下看看computeFrames自带的日志:
在这里插入图片描述
却得到如下结果:
在这里插入图片描述
可以看到x的坐标其实从-93变成了0,这里最后的打印也就是实际显示的,那么到底是哪里吧-93变成0呢?

在这里插入图片描述
这里再查阅代码发现有个二fitToDisplay,即这里看着有个适配屏幕操作,也会改变这个坐标,这里也加入一下打印
在这里插入图片描述

从日志也可以看出来:
在这里插入图片描述

剖析一下fitToDisplay

  final boolean fitToDisplay = !inMultiWindowMode
            || ((attrs.type != TYPE_BASE_APPLICATION) && !noLimits);

注意可以看到这里有多个限制,如果想让fitToDisplay不为true,其实还是有较多方法,这里可以考虑noLimits

        final boolean noLimits = (attrs.flags & FLAG_LAYOUT_NO_LIMITS) != 0;

再看看applyDisplay方法

    public static void applyDisplay(int gravity, @NonNull Rect display, @NonNull Rect inoutObj) {
        if ((gravity&DISPLAY_CLIP_VERTICAL) != 0) {
            if (inoutObj.top < display.top) inoutObj.top = display.top;
            if (inoutObj.bottom > display.bottom) inoutObj.bottom = display.bottom;
        } else {
            int off = 0;
            if (inoutObj.top < display.top) off = display.top-inoutObj.top;
            else if (inoutObj.bottom > display.bottom) off = display.bottom-inoutObj.bottom;
            if (off != 0) {
                if (inoutObj.height() > (display.bottom-display.top)) {
                    inoutObj.top = display.top;
                    inoutObj.bottom = display.bottom;
                } else {
                    inoutObj.top += off;
                    inoutObj.bottom += off;
                }
            }
        }
        
        if ((gravity&DISPLAY_CLIP_HORIZONTAL) != 0) {
            if (inoutObj.left < display.left) inoutObj.left = display.left;
            if (inoutObj.right > display.right) inoutObj.right = display.right;
        } else {
            int off = 0;
            if (inoutObj.left < display.left) off = display.left-inoutObj.left;
            else if (inoutObj.right > display.right) off = display.right-inoutObj.right;
            if (off != 0) {
                if (inoutObj.width() > (display.right-display.left)) {
                    inoutObj.left = display.left;
                    inoutObj.right = display.right;
                } else {
                    inoutObj.left += off;
                    inoutObj.right += off;
                }
            }
        }
    }

明显可以看出这里会对设置的frame的left和display的left,这样就把我们最后窗口显示限制在display以内。

那么问题就清楚了,其实本质就是因为computeFrames的里面有个applyDisplay方法会判断是否超出屏幕,从而让window限制显示在屏幕里面。

解决超出屏幕限制方法:

上面分析fitToDisplay有提到这个标志就是限制根本


  final boolean noLimits = (attrs.flags & FLAG_LAYOUT_NO_LIMITS) != 0;
  final boolean fitToDisplay = !inMultiWindowMode
            || ((attrs.type != TYPE_BASE_APPLICATION) && !noLimits);

但是这个标志实际上app层面是可以控制的,考虑把这里的noLimits对应的FLAG_LAYOUT_NO_LIMITS带上,尝试看看
在这里插入图片描述
再运行测试如下:
在这里插入图片描述

完美运行,可以正常超出屏幕边界。

投屏专题部分:
https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg

更多framework详细代码和资料参考如下链接

hal+perfetto+surfaceflinger

https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615

更多framework假威风耗:androidframework007

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

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

相关文章

智能叮咚门铃的功能,开启未来家居安全新篇章

在科技日新月异的今天&#xff0c;智能家居产品正逐步渗透到我们生活的每一个角落&#xff0c;其中&#xff0c;智能叮咚门铃作为家庭安防与便捷生活的重要一环&#xff0c;正经历着前所未有的功能升级与变革。 一、高清夜视&#xff0c;全天候守护 全新智能叮咚门铃配备了高清…

芒果/充电桩系统云快充1.5底层协议源码(源码)

充电桩系统云快充1.5底层协议源码&#xff08;源码&#xff09; 介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩系统桩直连协议 软件架构 1、提供云快充底层桩直连协议&#xff0c;版本为云快充1.5&#xff0c;对于没有对接过…

网上都是Python淘汰了!Python没用了!为什么都看不上Python?

最近&#xff0c;看到网上好多人站在在职程序员的角度去分析编程语言的一个优劣&#xff0c;劝小白学这个语言别学那个语言&#xff0c;这对小白来说是毫无意义的。 但是它又具有极强的一个误导性。 针对“Python没用了&#xff1f;马上就要被淘汰啦&#xff1f;为什么这么多…

8月22日笔记

解决centos7本地服务器刚安装之后yum install -y wget出现问题情况 首先网络能ping得通&#xff0c;然后就是yum命令会出问题&#xff0c;网上很多方法都是用wget命令来解决的&#xff0c;但是本身就没有wget&#xff0c;我怎么解决&#x1f605;。还有就是改/etc/sysconfig/n…

推荐并整理一波vscode插件(哪些内置了,哪些好用)

文章目录 背景现在还在用的&#xff08;21款&#xff09;Chinese(Simplified)简体中文Chinese LoremLorem ipsumCode Runner&#xff08;很推荐&#xff09;Codeium: AI Coding Autocomplete&#xff08;推荐&#xff09;Draw.io IntegrationESLintHighlight Matching TagJavaS…

Window访问Linux目录权限问题

Linux 上已经安装 了 samba 服务&#xff0c;但有时会发现从window上无法打开一些目录&#xff0c;点击后没有反应也没有弹窗提示&#xff0c;如&#xff1a; 而且当用 sourceinsight 添加文件时&#xff0c;这些目录下也搜索不到任何文件&#xff0c;其原因是目录权限问题。注…

AI绘图 | Stable Diffusion教程,零基础上手(附最新最全安装包)

前言 通过Stable Diffusion技术&#xff0c;一个人可以毫不费力地实现令人惊叹的AI绘图&#xff0c;让创意和想象力跃然纸上。这项技术运用先进的深度学习模型&#xff0c;将简单的文字描述转化为精美绝伦的艺术作品。无需深厚的绘画功底或昂贵的设备&#xff0c;只需输入一段…

开放式耳机哪个品牌好?分享四款开放式蓝牙耳机排行榜前十名

我相信很多人都会有这些问题&#xff0c;不知道入手什么蓝牙耳机品牌、有线耳机不好收纳、有线耳机不方便携带、蓝牙耳机听歌的音质怎么样、蓝牙耳机是否会对大脑有危害、蓝牙耳机有什么品牌型号推荐以及想要不同价位的蓝牙耳机品牌推荐参考&#xff0c;okok问题也是很多&#…

【数据结构】关于快速排序,归并排序,计数排序,基数排序,你到底了解多少???(超详解)

前言&#xff1a; &#x1f31f;&#x1f31f;Hello家人们&#xff0c;这期继续讲解排序算法的原理&#xff0c;希望你能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/g7PyB &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlct…

每日OJ_牛客_因子个数(简单模拟)

目录 牛客_因子个数&#xff08;简单模拟&#xff09; 解析代码 牛客_因子个数&#xff08;简单模拟&#xff09; 因子个数__牛客网 解析代码 题意就是求一个数字的因子&#xff08;>2的最小不能整除数字&#xff09;个数&#xff1a;可以从最小因子2到数字的最大因子数&…

Git基础学习(二)

文章目录 一. Git方式的基本概念二. Git的使用方式三. Git的常规操作1. 创建版本库(本地仓库)2. 设置用户信息配置1> 查看git的配置列表a. 全局变量b. 局部变量c. 修改对应文件进行配置d. 有个别仓库需要配置成其他用户信息&#xff0c;可进入目标仓库所在文件&#xff0c;e…

Python 如何使用 itertools 模块

itertools 是 Python 中一个非常有用的模块&#xff0c;它提供了许多用于处理迭代器的函数工具。itertools 模块中的函数可以用于生成复杂的迭代器&#xff0c;以支持各种组合、排列和计数操作。 1. 什么是 itertools&#xff1f; itertools 是 Python 的标准库模块&#xff…

自闭症学校收多大儿童?让每个孩子都能获得关爱

在星贝育园&#xff0c;我们深知每一个自闭症儿童都是家庭的希望与未来&#xff0c;他们虽然面临独特的挑战&#xff0c;但同样值得拥有爱与关怀。因此&#xff0c;我们敞开怀抱&#xff0c;欢迎2至20岁的自闭症儿童加入我们的大家庭&#xff0c;让每个孩子都能在这里找到属于自…

腾讯优图开源多模态大模型VITA : GPT-4o的简易平替!

Abs&#xff1a;https://arxiv.org/pdf/2408.05211 Demo&#xff1a;https://vita-home.github.io/ Code&#xff1a;https://github.com/VITA-MLLM/VITA GPT-4o 的卓越多模态能力和用户交互体验在实际应用中非常重要&#xff0c;但没有开源模型在这两个领域同时表现出色。本文…

【c语言】整数在内存中的储存(大小端字节序)

整数在内存中的储存&#xff08;大小端字节序&#xff09; 1.整数在内存中的储存 2.大小端字节序 3.整数在内存中储存例子 4.字节序判断 5.死循环现象 文章目录 整数在内存中的储存&#xff08;大小端字节序&#xff09;整数在内存中的储存大小端字节序什么是大小端为什么会有…

TinaLinux NPU开发

MobileNet V2 MobileNet V2是一种轻量级的卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;专门设计用于在移动设备和嵌入式设备上进行计算资源受限的实时图像分类和目标检测任务。 以下是MobileNet V2的一些关键特点和创新之处&#xff1a; Depthwise Separable Co…

鸿蒙OS promptAction的使用

效果如下&#xff1a; import { promptAction } from kit.ArkUIlet customDialogId: number 0Builder function customDialogBuilder() {Column() {Blank().height(30)Text(确定要删除吗&#xff1f;).fontSize(15)Blank().height(40)Row() {Button("取消").onClick…

【中仕公考怎么样】2024下半年事业编联考冲刺!

多地下半年事业单位联考公告发布!11月2日笔试! 笔试时间&#xff1a;2024年11月2日(周六)上午。 08:30—10:00 《职业能力倾向测验》10:00—12:00 《综合应用能力》 考试科目&#xff1a; 综合应用能力(A类) 社会科学专技类(B类) 自然科学专技类(C类) 中小学教师类(D类) 医…

.[RestoreBackup@cock.li].SRC勒索病毒数据怎么处理|数据解密恢复

导言&#xff1a; 在数字化时代&#xff0c;信息技术的飞速发展极大地促进了社会进步与经济繁荣&#xff0c;但同时也为网络犯罪分子提供了前所未有的便利。近年来&#xff0c;勒索病毒作为一种新兴的网络威胁&#xff0c;正以前所未有的速度和规模肆虐全球&#xff0c;给个人…

鸿蒙实现在图片上进行标注

一.实现思路 现在需求是&#xff1a;后端会返回在这张图片上的相对位置&#xff0c;然后前端这边需要在图片上进行标注&#xff0c;就是画个框框圈起来&#xff0c;返回的数据里包括当前框的x,y坐标和图片大小&#xff0c;大体思路就是使用canvas绘制&#xff0c;使用鸿蒙的st…