Android10: 动态隐藏导航栏和状态栏总结
(1)全屏相关设置
//(1)主题添加
<item name="android:windowFullscreen">true</item>//(2)setContentView之前添加
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); //(3)任意位置添加flag
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) //隐藏状态栏
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) //显示状态栏 //(4)通过setsystemUiVisibility添加
int uiOptions = View.SYSTEM_UI_LAYOUT_FLAGS| View.SYSTEM_UI_FLAG_LAYOUT_STABLE| View.SYSTEM_UI_FLAG_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;getWindow().getDecorView().setSystemUiVisibility(uiOptions);getWindow().setStatusBarColor(Color.TRANSPARENT);//透明状态栏
getWindow().setNavigationBarColor(Color.TRANSPARENT); //透明导航栏
(2)部分属性解析
//默认显示状态栏和导航栏
View.SYSTEM_UI_FLAG_VISIBLE
//低调模式,隐藏不重要的状态栏图标,导航栏中相应的图标都变成了一个小点
View.SYSTEM_UI_FLAG_LOW_PROFILE
//稳定布局,需要配合SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION和SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN使用,同时设置布局的android:fitsSystemWindows属性
View.SYSTEM_UI_FLAG_LAYOUT_STABLE//全屏显示,隐藏状态栏,点击屏幕区域不会出现,需要从状态栏位置下拉才会出现
View.SYSTEM_UI_FLAG_FULLSCREEN
//全屏显示,将布局内容拓展到导航栏和状态栏的后面,状态栏不会被隐藏覆盖,状态栏依然可见,Activity布局部分会被状态栏遮挡
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
//隐藏导航栏,点击屏幕任意区域,导航栏将重新出现,并且不会自动消失
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
//将布局内容拓展到导航栏的后面
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION//配合SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_FULLSCREEN使用,使状态栏和导航栏真正的进入沉浸模式。
//点击屏幕任意区域,不会退出全屏模式,只有用户上下拉状态栏或者导航栏时才会退出——这个属性会导致拉出后状态栏和导航栏不会被自动隐藏
View.SYSTEM_UI_FLAG_IMMERSIVE
//效果跟View.SYSTEM_UI_FLAG_IMMERSIVE一样。但是,它在全屏模式下,用户上下拉状态栏或者导航栏时,这些系统栏只是以半透明的状态显示出来,并且在一定时间后会自动消失
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
(3)不允许上下拉出现状态栏和导航栏需求
View.SYSTEM_UI_FLAG_FULLSCREEN
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
通过以上属性来隐藏状态栏和导航栏,发现上下拉还是会出现状态栏和导航栏,现在的需求是不要出现状态栏和导航栏。
可通过如下方式拦截:
//frameworks/base/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.javainterface Callbacks {void onSwipeFromTop();void onSwipeFromBottom();void onSwipeFromRight();void onSwipeFromLeft();void onFling(int durationMs);void onDown();void onUpOrCancel();void onMouseHoverAtTop();void onMouseHoverAtBottom();void onMouseLeaveFromEdge();void onDebug();
}private final Callbacks mCallbacks;SystemGesturesPointerEventListener(Context context, Handler handler, Callbacks callbacks) {mContext = checkNull("context", context);mHandler = handler;mCallbacks = checkNull("callbacks", callbacks);onConfigurationChanged();
}public void onPointerEvent(MotionEvent event) {if (mGestureDetector != null && event.isTouchEvent()) {mGestureDetector.onTouchEvent(event);}switch (event.getActionMasked()) {case MotionEvent.ACTION_DOWN:mSwipeFireable = true;mDebugFireable = true;mDownPointers = 0;captureDown(event, 0);if (mMouseHoveringAtEdge) {mMouseHoveringAtEdge = false;mCallbacks.onMouseLeaveFromEdge();}mCallbacks.onDown();break;case MotionEvent.ACTION_POINTER_DOWN:captureDown(event, event.getActionIndex());if (mDebugFireable) {mDebugFireable = event.getPointerCount() < 5;if (!mDebugFireable) {if (DEBUG) Slog.d(TAG, "Firing debug");mCallbacks.onDebug();}}break;case MotionEvent.ACTION_MOVE:if (mSwipeFireable) {final int swipe = detectSwipe(event);mSwipeFireable = swipe == SWIPE_NONE;if (swipe == SWIPE_FROM_TOP) {if (DEBUG) Slog.d(TAG, "Firing onSwipeFromTop");mCallbacks.onSwipeFromTop();} else if (swipe == SWIPE_FROM_BOTTOM) {if (DEBUG) Slog.d(TAG, "Firing onSwipeFromBottom");mCallbacks.onSwipeFromBottom();} else if (swipe == SWIPE_FROM_RIGHT) {if (DEBUG) Slog.d(TAG, "Firing onSwipeFromRight");mCallbacks.onSwipeFromRight();} else if (swipe == SWIPE_FROM_LEFT) {if (DEBUG) Slog.d(TAG, "Firing onSwipeFromLeft");mCallbacks.onSwipeFromLeft();}}break;case MotionEvent.ACTION_HOVER_MOVE:if (event.isFromSource(InputDevice.SOURCE_MOUSE)) {if (!mMouseHoveringAtEdge && event.getY() == 0) {mCallbacks.onMouseHoverAtTop();mMouseHoveringAtEdge = true;} else if (!mMouseHoveringAtEdge && event.getY() >= screenHeight - 1) {mCallbacks.onMouseHoverAtBottom();mMouseHoveringAtEdge = true;} else if (mMouseHoveringAtEdge&& (event.getY() > 0 && event.getY() < screenHeight - 1)) {mCallbacks.onMouseLeaveFromEdge();mMouseHoveringAtEdge = false;}}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:mSwipeFireable = false;mDebugFireable = false;mCallbacks.onUpOrCancel();break;default:if (DEBUG) Slog.d(TAG, "Ignoring " + event);}}
可从如上回调函数位置屏蔽相关滑动事件,从而实现不在出现状态栏和导航栏
//frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.javaprivate final SystemGesturesPointerEventListener mSystemGestures;mSystemGestures = new SystemGesturesPointerEventListener(mUiContext, mHandler,new SystemGesturesPointerEventListener.Callbacks() {//从上往下滑触发@Overridepublic void onSwipeFromTop() {//通过包名等判断条件,屏蔽上下滑动事件,从而不出现导航栏和状态栏if(tempStatus()){Slog.i(TAG, "onSwipeFromTop not Status Bar");return;}}//从下往上滑触发@Overridepublic void onSwipeFromBottom() {//通过包名等判断条件,屏蔽上下滑动事件,从而不出现导航栏和状态栏if(tempStatus()){Slog.i(TAG, "onSwipeFromBottom not Navigation Bar");return;}}//从右往左滑触发@Overridepublic void onSwipeFromRight() {}//从左往右滑触发@Overridepublic void onSwipeFromLeft() {}@Overridepublic void onFling(int duration) {}@Overridepublic void onDebug() {}@Overridepublic void onDown() {}@Overridepublic void onUpOrCancel() {}@Overridepublic void onMouseHoverAtTop() {}@Overridepublic void onMouseHoverAtBottom() {}@Overridepublic void onMouseLeaveFromEdge() {}});private boolean tempStatus(){int tempEnable = Settings.Global.getInt(mContext.getContentResolver(), "temp_value", 0);ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningTaskInfo> runningTasks = am.getRunningTasks(1);String topActivityPackage = "";if (runningTasks != null && !runningTasks.isEmpty()) {ActivityManager.RunningTaskInfo taskInfo = runningTasks.get(0);topActivityPackage = taskInfo.topActivity.getPackageName();}Slog.i(TAG, "dxf_tempStatus tempEnable = "+ tempEnable + ", topActivityPackage = " + topActivityPackage);return tempEnable == 1 && "com.xxxx.xxxx".equals(topActivityPackage);}
相关文章:
Android10: 动态隐藏导航栏和状态栏总结
(1)全屏相关设置 //(1)主题添加 <item name"android:windowFullscreen">true</item>//(2)setContentView之前添加 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCRE…...
roop 视频换脸
roop: one click face swap. 只用一张人脸图片,就能完成视频换脸。 项目地址: https://github.com/s0md3v/roopColab 部署: https://github.com/dream80/roop_colab 本文是本地部署的实践记录。 环境基础 OS: Ubuntu 22.04.2 LTSKernel: 5…...
Java类集框架(一)
目录 1.Collection集合接口 2.List 接口 (常用子类 ArrayList ,LinkedList,Vector) 3.Set 集合 接口(常用子类 HashSet LinkedHashSet,TreeSet) 4.集合输出(iterator , Enumeration) 1.Collection集合接口 Collection是集合中最大父接口,在接口中定义了核心的…...
Jsp+Ssh+Mysql实现的简单的企业物资信息管理系统项目源码附带视频指导运行教程
由jspssh(springstruts2mysql)实现的企业物资信息管理系统,系统功能比较简单,实现了基本的管理员、操作员等用户管理、物品分类管理、物品管理、入库管理、出库管理、库存预警、客户管理、供应商管理等基本功能需要的可以联系我分…...
【Spring】深究SpringBoot自动装配原理
文章目录 前言1、main入口2、SpringBootApplication3、EnableAutoConfiguration4、AutoConfigurationImportSelector4.1、selectImports()4.2、getAutoConfigurationEntry()4.3、getCandidateConfigurations()4.4、loadFactoryNames() 5、META-INF/spring.factories6、总结 前言…...
阿里云负载均衡SLB网络型NLB负载均衡架构性能详解
阿里云网络型负载均衡NLB是阿里云推出的新一代四层负载均衡,支持超高性能和自动弹性能力,单实例可以达到1亿并发连接,帮您轻松应对高并发业务。网络型负载均衡NLB具有超强性能、自动弹性伸缩、高可用、TCPSSL卸载、多场景流量分发和丰富的高级…...
JavaScript学习 -- SM4算法应用实例
SM4算法,也被称为国密算法,是中国公布的一种高效且安全的对称加密算法。在JavaScript中,我们可以通过使用CryptoJS库来实现SM4算法的加密和解密。本篇博客将为您介绍如何在JavaScript中使用SM4算法,并提供一个实际的案例。 首先&…...
【JVM】什么是双亲委派机制
文章目录 1、类加载机制2、双亲委派模型2.1、介绍2.2、为什么需要双亲委派2.3、源码解析 3、破坏双亲委派3.1、介绍3.2、破坏实现3.3、破坏双亲委派的例子 4、线程上下文类加载器 1、类加载机制 类加载阶段分为加载、连接、初始化三个阶段,而加载阶段需要通过类的全…...
网络安全 Day24-select高级用法和多表连接
select高级用法和多表连接 1. select 多子句单表高级实践1.1 select 多子句高级语法1.2 聚合函数1.3 group by 实践1.4 having 筛选1.5 order by 排序1.6 limit 2. 多表连接 1. select 多子句单表高级实践 1.1 select 多子句高级语法 where 和 having 区别是后者是分组后进行…...
JUC并发编程之volatile详解
目录 1. volatile 1.1 volatile关键字的作用 1.1.1 变量可见性 1.1.2 禁止指令重排序 1.2 volatile可见性案例 1.3 volatile非原子性案例 1.4 volatile 禁止重排序 1.5 volatile 日常使用场景 送书活动 1. volatile 在并发编程中,多线程操作共享的变量时&a…...
swing布局详解
1. 布局管理器接口 (1)说明 布局管理器接口为LayoutManager和LayoutManager2,LayoutManager2是LayoutManager的子类。 (2)常用方法 方法描述LayoutManageraddLayoutComponent(String name, Component comp) removeL…...
el-table某一列嵌套使用el-popover,使用click触发,导致页面下拉框组件无法触发弹框关闭(解决办法)
在弹框触发的方法里加上document.body.click() 即可 尝试了很多其他的方法都没用,只有这个解决了 完整代码: <el-select change"sourceChange" clearable ><el-optionv-for"option in list1":key"option.code":…...
正泰电力携手图扑:VR 变电站事故追忆反演
VR(Virtual Reality,虚拟现实)技术作为近年来快速发展的一项新技术,具有广泛的应用前景,支持融合人工智能、机器学习、大数据等技术,实现更加智能化、个性化的应用。在电力能源领域,VR 技术在高性能计算机和专有设备支…...
报错 -bash: wget: command not found
1、报错 -bash: wget: command not found 可以重装 wget 工具: 卸载 wget 工具 yum remove wget下载 wget 工具 yum -y install wget最后尝试 wget “url” 又OK了,一般是原来的wget初始化有文件损坏造成的。...
HashMap扩容和Redis中Dict 扩容
扩容时机: Hash Map:要在某个临界点进行扩容处理,该临界点就是HashMap中元素的数量在数值上等于threshold(table数组长度*加载因子) Dict: 当每次新增键值对的时 , 会检测 负载因子(LoadFactor) , 判断以…...
【Redis】内存数据库Redis进阶(Redis持久化)
目录 分布式缓存 Redis 四大问题Redis 持久化RDB (Redis DataBase)RDB执行时机RDB启动方式——save指令save指令相关配置save指令工作原理save配置自动执行 RDB启动方式——bgsave指令bgsave指令相关配置bgsave指令工作原理 RDB三种启动方式对比RDB特殊启动形式RDB优点与缺点 A…...
在PHP8中检测数据类型-PHP8知识详解
在PHP 8中,可以使用多种方法来检测数据类型。以下是常用的四种方法:使用 gettype() 函数、使用 is_* 系列函数、使用 get_debug_type() 函数、使用 get_class() 函数。 一、使用 gettype() 函数 gettype() 函数返回给定变量的数据类型。例如:…...
amoeba实现MySQL读写分离
amoeba实现MySQL读写分离 准备环境:主机A和主机B作主从配置,IP地址为192.168.131.129和192.168.131.130,主机C作为中间件,也就是作为代理服务器,IP地址为192.168.131.136。三台服务器操作系统为RHEL6.4 x86_64,为…...
angr学习-入门篇
前言: 资源链接:GitHub - jakespringer/angr_ctf(题库仓库,里面有个讲解angr的PPT,里面有官方的题解很详细) GitHub - Hustcw/Angr_Tutorial_For_CTF: angr tutorial for ctf 安装: 关于angr…...
基于java SpringBoot和HTML的博客系统
随着网络技术渗透到社会生活的各个方面,传统的交流方式也面临着变化。互联网是一个非常重要的方向。基于Web技术的网络考试系统可以在全球范围内使用互联网,可以在本地或异地进行通信,大大提高了通信和交换的灵活性。在当今高速发展的互联网时…...
LingBot-Depth模型优化技巧:处理高分辨率图像的实用方法
LingBot-Depth模型优化技巧:处理高分辨率图像的实用方法 你是不是遇到过这样的情况:拿到一张高分辨率的室内场景照片,兴冲冲地丢给深度估计模型,结果要么显存爆炸,要么生成的效果图边缘模糊、细节丢失,完全…...
用CT001解读Type-C线材设计:为什么只有一个CC灯亮?
拿到POWER-Z CT001测试仪,很多用户第一次测试C to C线材时,都会产生一个疑问:为什么线材明明能正常充电,CT001上却只有一个CC指示灯亮起?另一个CC对应的位置始终不亮,是线材有问题吗? 答案很明确…...
宝塔部署前后端时,配置域名与ssl证书
创建文件夹1.后端部署部署之后点击设置这步骤最关键# HTTP反向代理相关配置开始 >>>location ~ /purge(/.*) {proxy_cache_purge cache_one $Host$request_uri$is_args$args;}location / {proxy_pass http://127.0.0.1:8773;proxy_set_header Host $Host:$server_port…...
Phi-4-mini-reasoning应用场景:科研助理——论文公式推导验证与符号计算辅助
Phi-4-mini-reasoning应用场景:科研助理——论文公式推导验证与符号计算辅助 1. 模型概述 Phi-4-mini-reasoning是一款由微软开发的轻量级开源模型,专注于数学推理和逻辑推导任务。这个3.8B参数的模型虽然体积小巧,但在强逻辑任务上表现出色…...
MCP23017按键矩阵驱动库:嵌入式I²C GPIO扩展与中断控制
1. 项目概述MentorBitMatrizPulsadores 是一款专为 MentorBit 兼容硬件平台设计的嵌入式驱动库,核心目标是简化基于 MCP23017 IC GPIO 扩展器的按键矩阵(Keypad Matrix)控制与状态读取。该库并非从零实现底层 IC 通信协议,而是构建…...
FastBle终极指南:如何快速开发智能家电蓝牙遥控器
FastBle终极指南:如何快速开发智能家电蓝牙遥控器 【免费下载链接】FastBle Android Bluetooth Low Energy (BLE) Fast Development Framework. It uses simple ways to filter, scan, connect, read ,write, notify, readRssi, setMTU, and multiConnection. 项目…...
AI辅助开发新体验:描述你的健康应用构想,快马一键生成Compose项目代码
最近在尝试开发一个Android端的个人健康数据追踪应用,发现用传统方式从零开始写代码特别耗时。正好体验了InsCode(快马)平台的AI辅助开发功能,整个过程变得轻松多了。下面分享下这个健康应用的实现思路和关键模块设计。 整体架构设计 采用Clean Architec…...
从‘数值灾难’到平稳训练:深入浅出聊聊MoE中路由Z-loss的设计哲学
从‘数值灾难’到平稳训练:深入浅出聊聊MoE中路由Z-loss的设计哲学 想象一下,你正在指挥一个由数百名专家组成的交响乐团。每位音乐家都技艺精湛,但如果在演奏时某个乐器的音量突然爆表(比如小号手过于兴奋)ÿ…...
ThinkLink+EdgeBus 将建大仁科的氧传感器接入到LoRaWAN系统
传统 RS485 传感器,也能快速接入 LoRaWAN 系统很多项目现场,其实已经部署了不少成熟可用的传感器。 问题往往不在于“传感器能不能测”,而在于:怎样把这些传统传感器,快速接入 LoRaWAN 和上层业务系统?以 R…...
森利威尔SL3073替代RT2862 4-65V超宽压3A降压芯片
在电源管理领域,寻找高效、可靠且功能丰富的DC-DC转换器是设计工程师们不懈追求的目标。当面临将36V电压转换为更低电压并保持3A持续输出电流的应用场景时,传统上可能会选择如RT2862这样的同步降压转换器。然而,随着技术的不断进步࿰…...
