Android如何判断页面是否全屏
作者:七适散人 发布时间:2021-08-31 14:03:22
Android 想判断 Activity 是否是全屏,网上找了些方法,看到有直接获取 flags 和一个具体的值比较,并没有用,其实分析下来也觉得应该不对。大多都是如何设置全屏和取消全屏,并没有判断是否全屏的方法。
其实全屏控制要么通过主题设置,要么代码 addFlags,最终都会到 Window 的 setFlags 方法里,下面看源码:
public void setFlags(int flags, int mask) {
final WindowManager.LayoutParams attrs = getAttributes();
attrs.flags = (attrs.flags&~mask) | (flags&mask);
mForcedWindowFlags |= mask;
dispatchWindowAttributesChanged(attrs);
}
主要的逻辑就是这一句:
attrs.flags = (attrs.flags&~mask) | (flags&mask)
是位运算,看一下 attrs 里可以设置的 flag 常量
public static final int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON = 0x00000001;
public static final int FLAG_DIM_BEHIND = 0x00000002;
public static final int FLAG_BLUR_BEHIND = 0x00000004;
public static final int FLAG_NOT_FOCUSABLE = 0x00000008;
public static final int FLAG_NOT_TOUCHABLE = 0x00000010;
public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020;
public static final int FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040;
public static final int FLAG_KEEP_SCREEN_ON = 0x00000080;
public static final int FLAG_LAYOUT_IN_SCREEN = 0x00000100;
public static final int FLAG_LAYOUT_NO_LIMITS = 0x00000200;
public static final int FLAG_FULLSCREEN = 0x00000400;
public static final int FLAG_FORCE_NOT_FULLSCREEN = 0x00000800;
public static final int FLAG_DITHER = 0x00001000;
public static final int FLAG_SECURE = 0x00002000;
public static final int FLAG_SCALED = 0x00004000;
public static final int FLAG_IGNORE_CHEEK_PRESSES = 0x00008000;
public static final int FLAG_LAYOUT_INSET_DECOR = 0x00010000;
public static final int FLAG_ALT_FOCUSABLE_IM = 0x00020000;
public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;
public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;
public static final int FLAG_SHOW_WALLPAPER = 0x00100000;
public static final int FLAG_TURN_SCREEN_ON = 0x00200000;
public static final int FLAG_DISMISS_KEYGUARD = 0x00400000;
public static final int FLAG_SPLIT_TOUCH = 0x00800000;
public static final int FLAG_HARDWARE_ACCELERATED = 0x01000000;
public static final int FLAG_LAYOUT_IN_OVERSCAN = 0x02000000;
public static final int FLAG_TRANSLUCENT_STATUS = 0x04000000;
public static final int FLAG_TRANSLUCENT_NAVIGATION = 0x08000000;
public static final int FLAG_LOCAL_FOCUS_MODE = 0x10000000;
public static final int FLAG_SLIPPERY = 0x20000000;
public static final int FLAG_LAYOUT_ATTACHED_IN_DECOR = 0x40000000;
public static final int FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS = 0x80000000;
很明显,这些十六进制值换成二进制的话,都只有一个 1,而且每个变量的 1 处于不同的位置,所以设置一个 flag 肯定就是将 flags 的对应位置设为 1,而 clearFlags 就是将对应位置设为 0。
比如 FLAG_FULLSCREEN 值为 0x00000400,换成二进制的话后面的位就是 0100 0000 0000,它控制的是从右向左数第 11 位。而 addFlags 时两个参数 flags 和 mask 一样。所以 (attrs.flags&~mask) | (flags&mask) 的 flags&mask 自己和自己作与运算,结果还是自己,而 ~mask 结尾为 1011 1111 1111,和原来的 flags 作与运算,则第 11 位肯定变成了 0,其它位和 1 作与运算,保持原样,再和后面做或,则第 11 位又变成了 1,而且这次运算只会影响到第 11 位,其它位置不变,不管原来第 11 位是 0 还是 1,结果都会变成 1。
相似的,如果是 clearFlags,第一个参数变成 0,第二个参数是 FLAG_FULLSCREEN,这样 (flags&mask) 必定为 0,只看前面,(attrs.flags&~mask) 这个运算第 11 位必为 0。
其实 (attrs.flags&~mask) | (flags&mask) 前面的与运算会将对应位置变成 0,然后看后面的与运算,后面算出结果对应位置是 1,那最终就是 1,后面算出是 0,那最终也是 0。而后面的控制就是 0 或者自己和自己作个与运算。
说了一大堆废话,其实就是最基础的位运算。那么想判断是否全屏很简单,只要看 flags 从右向左数第 11 位是 0 还是 1,只要与 FLAG_FULLSCREEN 做个逻辑与就行了,除了第 11 位,其它位都变成了 0。
判断方法为:
if ( (getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN)
== WindowManager.LayoutParams.FLAG_FULLSCREEN) {
// 是全屏
}
到这里就结束啦.
来源:https://mp.weixin.qq.com/s/AOEHSWvOREpt6K2OI-2_Uw


猜你喜欢
- @ApiModel使用场景在实体类上边使用,标记类时swagger的解析类概述提供有关swagger模型的其它信息,类将在操作中用作类型时自
- 作为工厂方法模式的孪生兄弟,相信大家对工厂方法模式和抽象工厂模式傻傻分不清楚吧。那么,就让我来拯救大家吧!抽象工厂模式定义:所谓抽象工厂模式
- 1、用ASCII码判断在 ASCII码表中,英文的范围是0-127,而汉字则是大于127,具体代码如下:string text = &quo
- Solr我还是个菜鸟,写这一些文章只是记录一下最近一段时间学习Solr的心得。 Solr是什么? 最近我学Solr的时候,一直看到一句话,S
- 一、前言用过Spring Cloud的同学都知道在使用动态配置刷新的我们要配置一个@RefreshScope 在类上才可以实现对象属性的的动
- 创建普通Maven工程导入所需依赖坐标:<dependencies> <!-- https://
- 23种设计模式第十四篇:java迭代器模式定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。类型:行为类模式类图:如
- 关于tomcat热部署on ‘update' action:【update】时,执行的操作。on frame deactivatio
- 一、分布式压测原理如下图(这个图说明的是要一台控制机,然后由这台控制机发压测脚本到每台远程执行机,然后由控制机收集执行机结果)二、修改 Jm
- 一 前言最近网上比较火的代码生成器,知识追寻者抽空试试了一下,感觉不是友好,只能说功能比较呆板吧,还需要自己玩填空题,修修补补,然后再次打开
- 一、概述 在C和C++语言中都有assert关键,表示断言。在Java中,同样也有assert关键字,表示断言,用法和含义都差不多
- 一、编码(转成字节数组)GetBytes 1、ASII码:字符串中的每个字符用一个字节表示。每个字符实际上只使用了7位,从00h
- 参数和返回值得加密目的为了保证接口不被人拦截下来恶意请求,保证程序的稳定性,我们可以使用接口加密的方法来保证参数和返回值的保密性。具体实现方
- 思路今天带大家实现一个上拉加载更多的ListView.GitHub传送门:PulmListView, 欢迎大家fork&&s
- 前言在上网的时候我们常常遇到文件上传的情况,例如上传头像、上传资料等;当然除了上传,遇见下载的情况也很多,接下来看看我们 servlet 中
- 环境:springcloud Hoxton.SR11本节主要了解系统中的谓词与配置的路由信息是如何进行初始化关联生成路由对象的。每个谓词工厂
- 本文实例讲述了C#实现Xml序列化与反序列化的方法。分享给大家供大家参考。具体实现方法如下:/// <summary>/// X
- 之前碰到个问题,使用webview的时候无法定位,最近19大没法墙,只能去百度逛逛,发现有人说要这么做 WebSe
- 需求某航空公司物流单信息查询,是一个post请求。通过后台模拟POST HTTP请求发现无法获取页面数据,通过查看航空公司网站后,发现网站使
- 注解注解定义Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变