Android学习之Window窗口

Android Window机制学习笔记

在使用Window Flag实现界面全屏功能时,发现自身对Android Window机制缺乏系统认知,因此进行了专项学习与整理。
本文主要参考以下优质资料:

  • Android的Window详解
  • Android官方Window文档

Window基本概念

1. Window的定义与特性

Window(窗口)是用户熟悉的图形界面元素,类似于Windows操作系统中的视窗概念。在Android中,Window作为系统与用户交互的界面载体,其核心特性包括:

  1. 层级结构:采用Z-order排序管理,层级通过WindowManager.LayoutParams.type属性指定。
  2. 显示区域:定义内容显示的位置和范围。
  3. 输入事件处理:负责接收和处理触摸、按键等用户输入事件。

2. Window的核心作用

Window的核心作用是内容呈现载体。它本质上是一个显示区域,具体内容依赖于View体系(如EditText、ImageView等)填充。多个View在Window上组合排列,最终构成用户界面。Window与View的关系特点:

  • 容器与内容:Window是容器,View是内容。
  • 一对一关系:每个Activity默认对应一个Window。
  • 树形结构:Window包含View树的根节点DecorView。

3. Window的实现机制

Window的实现依赖于以下关键系统组件:

  1. WindowManager:作为应用层接口,负责管理Window的添加、删除和更新操作。
  2. WindowManagerService (WMS):系统核心服务,实际执行Window的管理、布局和层级调度。
  3. SurfaceFlinger:负责将各个Window的Surface合成并最终渲染到显示设备。

4. Window的类型

Android系统定义了多种Window类型,主要分为三类:

  1. 应用Window (TYPE_APPLICATION):应用程序主窗口。
  2. 子Window (TYPE_APPLICATION_PANEL, TYPE_APPLICATION_SUB_PANEL等):必须依附于父应用Window。
  3. 系统Window (TYPE_SYSTEM_ALERT, TYPE_TOAST, TYPE_STATUS_BAR等):具有特殊权限或系统级别的窗口。

:在查阅资料时注意到"View树"概念,这与Android绘制机制紧密相关。View树的遍历和测量涉及measurelayoutdraw三个阶段,直接影响Window的最终渲染效果。这些内容将在后续深入学习渲染原理时详细研究,本文重点聚焦Window本身。

Window的层级结构

WindowManager的核心功能之一是管理窗口的显示层级(Z-order)。Android系统的窗口采用树形结构进行管理,每个Window的层级属性决定了其显示顺序和交互优先级。

窗口层级的基本原理

当多个界面元素叠加时,Z-order数值较大的窗口会覆盖在数值较小的窗口之上(越靠近用户)。WindowManager根据此数值决定窗口的堆叠顺序。

常见界面元素的层级规则

常见界面元素遵循特定的层级规则(按Z-order由低到高):

窗口类型 (WindowManager.LayoutParams.type)典型代表描述
TYPE_BASE_APPLICATION主界面窗口应用程序的基础界面层(如Activity的主视图)。
TYPE_APPLICATION_PANEL弹窗窗口应用程序内的对话框、提示框(如确认对话框)。
TYPE_INPUT_METHOD输入窗口软键盘等输入法窗口,具有较高优先级以保证输入体验。
TYPE_STATUS_BAR_PANEL下拉菜单 / 通知中心展开的系统级下拉菜单或通知面板,通常覆盖整个界面。
TYPE_NAVIGATION_BAR导航栏屏幕底部的三键虚拟导航栏,显示层级处于最高级别(即使在全屏状态下)。

层级应用实例

层级管理在具体场景中的应用:

  • 输入场景:输入框获得焦点时,系统自动提升相关窗口层级,确保软键盘不遮挡输入区域。
  • 弹出通知:系统通知(如TYPE_SYSTEM_ALERT)临时提升至最高层级,保证用户及时可见。
  • 全屏游戏:游戏画面(TYPE_APPLICATION)占据全屏,但导航栏(TYPE_NAVIGATION_BAR)仍可在需要时显示在最上层。
  • 支付安全:支付密码界面设置FLAG_SECURE并保持较高层级,防止被恶意覆盖或截屏。

WindowManager的操作接口

开发者主要通过WindowManager接口操作Window:

  1. addView(View view, ViewGroup.LayoutParams params):添加新的窗口视图。
  2. removeView(View view):移除窗口视图。
  3. updateViewLayout(View view, ViewGroup.LayoutParams params):更新窗口布局参数。
  4. getDefaultDisplay():获取显示设备相关信息(如尺寸、旋转状态)。

典型用法示例

// 获取WindowManager实例
val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager// 创建布局参数 (示例:创建一个悬浮窗)
val params = WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, // 宽度WindowManager.LayoutParams.WRAP_CONTENT, // 高度WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, // 类型 (系统悬浮窗,需权限)WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE // 标志 (不获取焦点)or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, // 标志 (允许延伸至状态栏下)PixelFormat.TRANSLUCENT // 像素格式 (支持透明)
)// 添加窗口视图
wm.addView(myCustomView, params)

这种层级管理机制确保了界面元素的有序呈现和流畅交互,为开发者提供了灵活的控制能力。

Window的属性

Window的属性共同定义了其显示特性和行为。以下是在原有分类基础上补充细节、扩展场景及实用案例的完整解析:

1. type属性(窗口类型)

type属性决定窗口的基本类别和层级,除基础分类外,补充系统级场景及典型类型:

  • 应用窗口
    • TYPE_APPLICATION:普通应用程序主窗口(如微信聊天页),依附于Activity生命周期。
    • TYPE_APPLICATION_STARTING:应用启动过渡窗口(闪屏页),提升加载感知。
  • 系统级窗口(通常需要特殊权限)
    • TYPE_STATUS_BAR:系统状态栏窗口(显示时间、电量等),层级高于普通应用窗口。
    • TYPE_SYSTEM_ALERT:系统警告窗口(权限请求、系统更新弹窗),需SYSTEM_ALERT_WINDOW权限。
  • 特殊用途窗口
    • TYPE_TOAST:Toast提示窗口(临时悬浮的轻量级提示如“操作成功”),自动消失且不阻塞交互。
    • TYPE_APPLICATION_PANEL:子窗口(依附于父窗口的面板如下拉菜单、弹窗选项),不可独立存在。

2. flag属性(窗口标志)

flag通过位掩码(|)组合控制窗口行为,补充进阶标志及应用场景:

  • 视觉与交互控制
    • FLAG_SECURE:禁止截图/录屏(保护支付密码等敏感内容)。
    • FLAG_KEEP_SCREEN_ON:保持屏幕常亮(适用于视频播放、导航应用)。
  • 系统栏与布局延伸
    • FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS:允许应用绘制状态栏/导航栏背景(实现透明状态栏效果,需配合View.SYSTEM_UI_FLAG_LAYOUT_*)。
    • FLAG_LAYOUT_NO_LIMITS:允许窗口内容延伸至屏幕外(适用于侧滑菜单、全屏手势交互区域)。
  • 焦点与输入管理
    • FLAG_NOT_FOCUSABLE:窗口不可获取焦点(如半透明背景蒙层,点击事件穿透到底层窗口)。
    • FLAG_NOT_TOUCH_MODAL:非模态窗口,触摸事件可传递到后面的窗口(常用于悬浮窗)。

3. 软键盘属性(windowSoftInputMode)

控制软键盘与窗口的交互逻辑,典型场景及组合:

  • SOFT_INPUT_ADJUST_RESIZE:窗口整体尺寸调整(高度压缩)以适应键盘(聊天界面底部输入框)。
  • SOFT_INPUT_ADJUST_PAN:平移窗口内容避免输入框被遮挡(长列表中的表单输入)。
  • SOFT_INPUT_STATE_HIDDEN | SOFT_INPUT_ADJUST_NOTHING:页面加载时主动隐藏键盘,且不进行任何布局调整(适用于纯展示型界面)。
  • SOFT_INPUT_STATE_ALWAYS_VISIBLE:当窗口获得焦点时,强制显示键盘(适用于搜索页等)。

4. 系统UI可见性控制(systemUiVisibility - View级别)

注意systemUiVisibility是设置在DecorView(属于View层级)上的标志,用于控制沉浸式体验:

  • View.SYSTEM_UI_FLAG_FULLSCREEN:隐藏状态栏,内容延伸至屏幕顶部(视频全屏播放)。
  • View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏导航栏(底部虚拟按键),适用于游戏、电子书等全沉浸场景。
  • View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY:粘性沉浸模式 - 手势滑动临时显示系统栏,松手后自动隐藏(如YouTube全屏播放逻辑)。
  • View.SYSTEM_UI_FLAG_LAYOUT_STABLE:保持布局稳定,防止系统栏显隐导致内容跳动。
  • View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION / View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:允许内容布局延伸至被隐藏的系统栏区域,避免出现突兀黑边。

组合使用示例 (Kotlin)

window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_FULLSCREENor View.SYSTEM_UI_FLAG_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_IMMERSIVE_STICKYor View.SYSTEM_UI_FLAG_LAYOUT_STABLEor View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)

5. 其他重要属性(视觉与交互)

  • 透明度与模糊
    • alpha (0.0f - 1.0f):设置窗口整体透明度(0.5f用于半透明蒙层)。
    • dimAmount (0.0f - 1.0f):配合FLAG_DIM_BEHIND使用,控制窗口后面内容的模糊(变暗)程度(0.3f为轻度模糊背景)。
  • 动画与样式
    • 窗口过渡动画:通过Activity主题配置android:windowAnimationStyle(如@android:style/Animation.Dialog实现弹窗缩放效果)。
    • 隐藏默认标题栏:在onCreate()中调用requestWindowFeature(Window.FEATURE_NO_TITLE)
  • 尺寸与布局
    • width / height:可使用MATCH_PARENT, WRAP_CONTENT或具体像素值(对话框常用WRAP_CONTENT,Activity主窗口用MATCH_PARENT)。
    • gravity:控制窗口在屏幕上的初始位置(如Gravity.CENTER使对话框居中)。
    • x / y:指定窗口的绝对位置(常用于悬浮窗定位)。

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

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

相关文章

华为云 Flexus+DeepSeek 征文|搭建部署Dify-LLM推理引擎,赋能AI Agent智能体实现动态联网搜索能力

华为云 Flexus 云服务器 X 实例专门为 AI 应用场景设计。它提供了强大的计算能力,能够满足 DeepSeek 模型以及后续搭建 AI Agent 智能体过程中对于数据处理和模型运行的高要求。在网络方面,具备高速稳定的网络带宽,这对于需要频繁联网搜索信息…

Python 100个常用函数全面解析

Python 100个常用函数全面解析 1. 类型转换函数 1.1 int() 将字符串或数字转换为整数。 # 基本用法 int(123) # 123 int(3.14) # 3# 指定进制转换 int(1010, 2) # 10 (二进制转十进制) int(FF, 16) # 255 (十六进制转十进制)# 临界值处理 int() # ValueError: …

分享在日常开发中常用的ES6知识点【面试常考】

前言 在日常的业务开发中,可以熟悉运用掌握的知识点快速解决问题很重要。这篇分享JS相关的知识点,主要就是对数据的处理。 注意:本篇分享的知识点,只是起到一个抛砖引玉的作用,详情的使用和更多的ES6知识点还请参考官…

CHI协议验证中的异常及边界验证

CHI协议验证中的异常及边界验证 针对 CHI 协议的错误注入工具、覆盖率衡量方法及实际项目中的投入平衡 CHI 协议作为多核系统中复杂的缓存一致性协议,验证其行为需要强大的工具和方法来执行错误注入和边界条件测试,并衡量测试覆盖率。以下详细讨论常用工具、覆盖率评估方法及…

技术专栏|LLaMA家族——模型架构

LLaMA的模型架构与GPT相同,采用了Transformer中的因果解码器结构,并在此基础上进行了多项关键改进,以提升训练稳定性和模型性能。LLaMA的核心架构如图 3.14 所示,融合了后续提出的多种优化方法,这些方法也在其他模型&a…

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…

Go 语言实现高性能 EventBus 事件总线系统(含网络通信、微服务、并发异步实战)

前言 在现代微服务与事件驱动架构(EDA)中,事件总线(EventBus) 是实现模块解耦与系统异步处理的关键机制。 本文将以 Go 语言为基础,从零构建一个高性能、可扩展的事件总线系统,深入讲解&#…

npm ERR! @biomejs/biome@1.9.4 postinstall: `node scripts/postinstall.js`

npm install 报错如下, npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! @biomejs/biome@1.9.4 postinstall: `node scripts/postinstall.js` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the @biomejs/biome@1.9.4 postinstall script. npm ERR! This is pro…

APMPlus × veFaaS 一键开启函数服务性能监控,让函数运行全程可观测

资料来源:火山引擎-开发者社区 近年来,无服务器架构(Serverless)的崛起让开发者得以从基础设施的复杂性中解放,专注于业务逻辑创新。但随着采用率提升,新的问题开始出现——函数实例的短暂生命周期、动态变…

玛哈特零件矫平机:精密制造中的平整度守护者

在精密制造、模具、冲压、钣金加工、汽车零部件、航空航天以及电子设备等众多工业领域,零件的平整度(Flatness)是一项至关重要的质量指标。微小的翘曲、扭曲或弯曲都可能导致装配困难、功能失效、外观缺陷甚至影响整机性能。为了消除零件在加…

std::make_shared简化智能指针 `std::shared_ptr` 的创建过程,并提高性能(减少内存分配次数,提高缓存命中率)

std::make_shared 是 C 标准库中的一个函数模板,用于简化智能指针 std::shared_ptr 的创建过程。引入 std::make_shared 的主要原因是提高代码的安全性、性能和可读性。以下是详细分析: 1. 安全性提升 避免显式调用 new 导致的错误 在不使用 std::make…

JDK版本如何丝滑切换

一句话总结 》》》步骤分为: 下载对应JDK配置环境变量 下载JDK 如何下载JDK这里不必多提,提出一点,就是多个版本的JDK最好放在一个文件夹里(忽略我的java文件夹,这里都是不同的jdk版本): 配置环…

Rust 通用代码生成器:莲花,红莲尝鲜版三十六,哑数据模式图片初始化功能介绍

Rust 通用代码生成器:莲花,红莲尝鲜版三十六,哑数据模式图片初始化功能介绍 Rust 通用代码生成器莲花,红莲尝鲜版三十六。支持全线支持图片预览,可以直接输出带图片的哑数据模式快速原型。哑数据模式和枚举支持图片。…

45. Jump Game II

目录 题目描述 贪心 题目描述 45. Jump Game II 贪心 正向查找可到达的最大位置 时间复杂度O(n) class Solution { public:int jump(vector<int>& nums) {int n nums.size();if(n 1)return 0;int cur_cover 0;int cover 0;int res 0;for(int i 0;i < …

model.classifier 通常指模型的分类头 是什么,详细举例说明在什么部位,发挥什么作用

model.classifier 通常指模型的分类头 是什么,详细举例说明在什么部位,发挥什么作用 在深度学习模型中,分类头(Classifier Head)是指模型末端用于完成分类任务的组件,通常是一个或多个全连接层(线性层)。它的作用是将模型提取的高层语义特征映射到具体的分类标签空间。…

机器学习+城市规划第十四期:利用半参数地理加权回归来实现区域带宽不同的规划任务

机器学习城市规划第十四期&#xff1a;利用半参数地理加权回归来实现区域带宽不同的规划任务 引言 在城市规划中&#xff0c;如何根据不同地区的地理特征来制定有效的规划方案是一个关键问题。不同区域的需求和规律是不同的&#xff0c;因此我们必须考虑到地理空间的差异性。…

Kivy的ButtonBehavior学习

Kivy的ButtonBehavior学习 ButtonBehavior 简介1、主要特点2、基本用法3、主要事件4、常用属性5、方法代码示例 文档&#xff1a;https://kivy.org/doc/stable/api-kivy.uix.behaviors.button.html#kivy.uix.behaviors.button.ButtonBehavior ButtonBehavior 简介 ButtonBeha…

WPS中将在线链接转为图片

WPS中将在线链接转为图片 文章目录 WPS中将在线链接转为图片一&#xff1a;解决方案1、下载图片&#xff0c;精确匹配&#xff08;会员功能&#xff09;2、将在线链接直接转为图片 一&#xff1a;解决方案 1、下载图片&#xff0c;精确匹配&#xff08;会员功能&#xff09; …

API:解锁数字化协作的钥匙及开放实现路径深度剖析

API:解锁数字化协作的钥匙及开放实现路径深度剖析 一、API 的概念与本质 (一)定义与基本原理 API(Application Programming Interface,应用程序编程接口)是一组定义、协议和工具,用于构建和集成软件应用程序。它如同一个精心设计的合约,详细规定了软件组件之间相互交…

Azure 虚拟机端口资源:专用 IP 和公共 IP Azure Machine Learning 计算实例BUG

## 报错无解 找不到Azure ML 计算实例关联的 NSG .env 文件和 ufw status&#xff1a; .env 文件中 EXPOSE_NGINX_PORT8080 是正确的&#xff0c;它告诉 docker-compose.yaml 将 Nginx 暴露在宿主机的 8080 端口。 sudo ufw status 显示 Status: inactive&#xff0c;意味着宿…