当前位置: 首页 > news >正文

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.xdnf.cn/news/987049.html

相关文章:

  • 一个数组样式上要分成两个
  • Unity UGUI GraphicRaycaster.Raycast详解
  • 免费开源的微信开发框架
  • LangSmith 实战指南:大模型链路调试与监控的深度解析
  • Linux 内核 Slab 分配器核心组件详解
  • 【Linux】Linux高级I/O
  • 循环中的break和continue
  • Redis免费客户端工具推荐
  • Altair:用Python玩转声明式可视化(新手友好向)
  • C#委托代码记录
  • 推荐系统入门最佳实践:Slope One 算法详解与完整实现
  • 记录下blog的成长过程
  • 我的世界进阶模组开发教程——制作机械动力附属模组
  • MySQL存储引擎--深度解析
  • Go 语言 JWT 深度集成指南
  • 什么是哈希函数
  • C语言——深入解析字符串函数与其模拟实现
  • const auto 和 auto
  • Bash 脚本中的特殊变量
  • python使用SQLAlchemy 库操作本地的mysql数据库
  • python基本语法元素
  • python-docx 库教程
  • Oracle中10个索引优化
  • 美团NoCode中的Dev Mode 使用指南
  • 在windows中安装或卸载nginx
  • spring boot源码和lib分开打包
  • 遍历 unordered_map
  • GFS 分布式文件系统
  • UE_Event Any Damage和OnTake Any Damage
  • JAVA CAS 详解