rokevin
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
  • Z-Order

  • 一、Z-Order 的核心组成(决定层级的关键因素)
    • 1. Elevation(静态高程)
    • 2. TranslationZ(动态偏移量)
  • 二、Z-Order 的作用范围(不同层级维度)
    • 1. 视图级(同一 Window 内部)
    • 2. 窗口级(不同 Window 之间)
  • 三、Z-Order 与绘制顺序的关系
  • 四、关键注意事项
    • 总结

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)

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 轴从低到高)」的顺序,核心逻辑是:

  1. 系统先绘制 Z 值较低的 UI 元素(底层),再绘制 Z 值较高的元素(上层)。
  2. 上层元素会覆盖下层元素的重叠区域(除非设置了透明背景)。
  3. 补充:对于 Z 值相同的元素,遵循「布局 / 添加顺序」,后处理(后绘制)的元素在上层。

这种绘制机制保证了 Z-Order 的遮挡逻辑的一致性,同时也解释了「为什么后写的 View 会遮挡先写的 View」—— 本质是绘制顺序靠后,而非 Z 值更高(二者 Z 值相同时,绘制顺序起决定作用)。

四、关键注意事项

  1. Z-Order 仅在 Android 5.0(API 21)及以上版本完全支持(Elevation、TranslationZ 是 Material Design 引入的特性),低版本系统中这些属性会被忽略,仅遵循绘制顺序。
  2. 阴影效果依赖 Elevation,但需要满足两个条件:视图有背景(background)、视图没有被裁剪(clipToOutline=false),否则即使设置了 Elevation,也不会显示阴影。
  3. 跨 Window 层级调整只能通过 Window 的 Type 和 zOrderOnTop 实现,无法通过 View 的 Z 相关属性突破。
  4. 过度设置高 Z 值可能导致 UI 层级混乱,且阴影效果会带来一定的性能开销,需合理使用。

总结

  1. Android Z-Order 是决定 UI 元素遮挡关系的核心机制,核心规则是「Z 值越高,层级越靠上」。
  2. 视图内部 Z 值 = Elevation(静态) + TranslationZ(动态),窗口之间层级由 Window Type 和 zOrderOnTop 决定。
  3. 绘制顺序遵循「从低 Z 到高 Z」,Z 值相同时,后绘制的元素在上层。
  4. View 的 Z 相关属性无法跨 Window 生效,低版本系统仅支持基础绘制顺序逻辑。
最近更新:: 2026/1/15 03:00
Contributors: luokaiwen