Z-Order
Android 中的 Z-Order 相关知识,它本质上是Android 系统用于确定视图(View)、窗口(Window)等 UI 元素在屏幕上绘制层级(前后遮挡关系)的核心机制,核心遵循「Z 值(Z-coordinate)越高,元素越靠上(越晚绘制、越先被用户看到,遮挡下方元素)」的原则。
一、Z-Order 的核心组成(决定层级的关键因素)
Android 中一个 UI 元素的最终 Z 层级由两部分共同组成,二者叠加构成完整的 Z 值:
总 Z 值 = Elevation(静态高程) + TranslationZ(动态偏移量)
1. Elevation(静态高程)
含义:静态的、固定的视图高程,用于定义 UI 元素的基础层级,通常在布局文件中配置或代码中静态设置,代表元素的「默认悬浮高度」。
典型用途:实现卡片(CardView)、按钮(Button)的阴影效果(Android 5.0+ Material Design 核心特性),同时确定基础遮挡关系。
配置方式:
- XML 布局中:
android:elevation="8dp" - 代码中:
view.setElevation(8f);(单位为 px,可通过TypedValue.applyDimension()转换 dp)
- XML 布局中:
2. TranslationZ(动态偏移量)
含义:动态的、临时的 Z 轴偏移量,用于在 Elevation 基础上调整元素的层级,通常在交互过程中动态修改(如点击、动画效果)。
典型用途:实现视图点击时的「抬升效果」、弹窗弹出时的层级置顶、动画过程中的层级变化。
配置方式:
- 代码中动态设置:
view.setTranslationZ(16f); - 结合属性动画使用:
ObjectAnimator.ofFloat(view, "translationZ", 0f, 16f).setDuration(300).start();
- 代码中动态设置:
二、Z-Order 的作用范围(不同层级维度)
Android 的 Z-Order 并非全局统一,而是分为 ** 视图级(View Level)和窗口级(Window Level)** 两个独立维度,二者的层级优先级不同:
1. 视图级(同一 Window 内部)
适用场景:同一个 Activity/Fragment 内部的所有 View、ViewGroup(如 LinearLayout 中的按钮、卡片)。
层级规则:
- 优先遵循「总 Z 值(Elevation+TranslationZ)」:Z 值越高,越靠上(遮挡 Z 值低的视图)。
- 补充规则:若两个视图 Z 值完全相同,遵循「绘制顺序(遍历顺序)」—— 后被绘制的视图会遮挡先被绘制的视图(对应布局中后写的 View 会遮挡先写的 View,代码中后添加的 View 会遮挡先添加的 View)。
- 示例:同一布局中,两个 Button 分别设置
elevation="4dp"和elevation="8dp",后者会遮挡前者;若 Z 值相同,布局文件中后定义的 Button 遮挡先定义的。
2. 窗口级(不同 Window 之间)
适用场景:不同的 Window 之间(如 Activity 窗口、Dialog 弹窗、Toast、悬浮窗、状态栏)。
核心决定因素:Window 的 Type(窗口类型)和 WindowManager.LayoutParams 的 zOrderOnTop 属性(而非 View 的 Elevation/TranslationZ)。
关键规则:
Window Type 决定基础优先级:系统定义了不同 Window 类型的层级(如系统窗口 > 应用窗口 > 子窗口),例如悬浮窗(
TYPE_APPLICATION_OVERLAY)层级高于普通 Activity 窗口(TYPE_APPLICATION)。zOrderOnTop属性:布尔值,设置为true时,该 Window 会置顶于同类型 Window 的最上层(优先级高于同类型其他 Window),示例:WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.zOrderOnTop = true; // 该窗口置顶显示 windowManager.addView(floatingView, params);注意:View 的 Elevation 仅对当前 Window 内部有效,无法跨 Window 提升层级(例如,即使给 Activity 中的 View 设置极高的 Elevation,也无法遮挡 Dialog 窗口)。
三、Z-Order 与绘制顺序的关系
Android 的 UI 绘制遵循「从上到下(Z 轴从低到高)」的顺序,核心逻辑是:
- 系统先绘制 Z 值较低的 UI 元素(底层),再绘制 Z 值较高的元素(上层)。
- 上层元素会覆盖下层元素的重叠区域(除非设置了透明背景)。
- 补充:对于 Z 值相同的元素,遵循「布局 / 添加顺序」,后处理(后绘制)的元素在上层。
这种绘制机制保证了 Z-Order 的遮挡逻辑的一致性,同时也解释了「为什么后写的 View 会遮挡先写的 View」—— 本质是绘制顺序靠后,而非 Z 值更高(二者 Z 值相同时,绘制顺序起决定作用)。
四、关键注意事项
- Z-Order 仅在 Android 5.0(API 21)及以上版本完全支持(Elevation、TranslationZ 是 Material Design 引入的特性),低版本系统中这些属性会被忽略,仅遵循绘制顺序。
- 阴影效果依赖 Elevation,但需要满足两个条件:视图有背景(
background)、视图没有被裁剪(clipToOutline=false),否则即使设置了 Elevation,也不会显示阴影。 - 跨 Window 层级调整只能通过 Window 的 Type 和
zOrderOnTop实现,无法通过 View 的 Z 相关属性突破。 - 过度设置高 Z 值可能导致 UI 层级混乱,且阴影效果会带来一定的性能开销,需合理使用。
总结
- Android Z-Order 是决定 UI 元素遮挡关系的核心机制,核心规则是「Z 值越高,层级越靠上」。
- 视图内部 Z 值 = Elevation(静态) + TranslationZ(动态),窗口之间层级由 Window Type 和
zOrderOnTop决定。 - 绘制顺序遵循「从低 Z 到高 Z」,Z 值相同时,后绘制的元素在上层。
- View 的 Z 相关属性无法跨 Window 生效,低版本系统仅支持基础绘制顺序逻辑。