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
猜你喜欢
- 一、简述mybatis驼峰式命名规则自动转换:使用前提:数据库表设计按照规范“字段名中各单词使用下划线"_"划分”;使用
- 工欲善其事,必先利其器,对于想要深入学习Android源码,必须先掌握Android编译命令.一、引言关于Android Build系统,这
- Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程
- 实现客户端发送请求,服务器端响应机制UDP客户端代码using System;using System.Text;using System.
- 布局管理器在java.awt 包中提供了5中常用的布局管理器,分别式FlowLayout(流式布局管理器)、BorderLayout(边界布
- android 点击EditText始终不弹出软件键盘场景描述:正常情况下,当点击EditText时,软键盘会弹出来。现在的要求
- Flutter 键值存储数据库键值存储是开发中十分常见的需求,在Flutter开发中,一般使用 shared_preferences 插件来
- 正常maven依赖jar包的pom.xml写法如下:<!-- https://mvnrepository.com/artifact/o
- 简介:本文将帮助您使用 Spring Boot 创建简单的 REST 服务。你将学习什么是 REST 服务?如何使用 Spring Init
- 本文为大家分享了Spring Boot全局异常处理,供大家参考,具体内容如下1、后台处理异常a、引入thymeleaf依赖<!-- t
- 背景Springboot 默认把异常的处理集中到一个ModelAndView中了,但项目的实际过程中,这样做,并不能满足我们的要求。具体的自
- 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。 在下面的描述中,将以&
- C# Path类—文件路径给定如下字符串类型filePath,表示一个文件路径:string filePath = &q
- 在本人用editplus写java文件时碰到的问题。 import java.util.*;class collection{ &
- SessionFactory在Hibernate中实际上起到了一个缓冲区的作用 他缓冲了HI
- 一、insert1.插入操作public class CRUDTests { @Autowired
- 本文实例讲述了Java Arrays工具类用法。分享给大家供大家参考,具体如下:Arrays类功能描述Arrays类是一个工具类,其中包含了
- 插件安装方式:新版本IDE安装方式略有不同,不一一赘述 1、Background Image Plus
- Spring Data Jpa复杂查询总结只是做一个总结所以就不多说废话了实体类@Entity@Table(name = "t_h
- 需求:有些时候,我们需要连接多个数据库,但是,在方法调用前并不知道到底是调用哪个。即同时保持多个数据库的连接,在方法中根据传入的参数来确定。