HarmonyOS应用开发实战:猫猫大作战-`Stack` 的 `alignContent` 9 位、`zIndex` 层序、状态遮罩叠层套路
前言前 8 篇我们拆的主菜单元素都在Column/Row里依次排列——标题在上、按钮在中、规则在下。但实战中有一类布局是「叠」而非「排」游戏页的棋盘 棋子 顶部 HUD三层叠在一起暂停时全屏遮罩盖在棋盘上弹窗居中浮在所有内容之上。这种「Z 轴叠层」就是Stack容器的主场。本篇以「猫猫大作战」游戏页的Stack根布局为锚点把Stack的alignContent9 位、zIndex层序、状态遮罩叠层套路讲透。读完本篇你将能独立写出三层叠游戏页、全屏暂停遮罩、居中浮弹窗三种叠层布局。提示本系列不讲 ArkTS 基础语法与环境搭建假设你已跟完第 1–8 篇。一、场景拆解游戏页 Stack 根布局打开entry/src/main/ets/pages/Index.ets的build()// 来源entry/src/main/ets/pages/Index.ets build() build() { Stack() { if (this.gameState GameState.IDLE) { MainMenuView() // 主菜单 } else if (this.gameState GameState.PLAYING || this.gameState GameState.PAUSED) { GameView() // 游戏页 if (this.gameState GameState.PAUSED) { PauseOverlay() // 暂停遮罩 } } else if (this.gameState GameState.GAME_OVER) { GameOverView() // 结束页 } } .width(100%).height(100%) }关键观察Stack只有一个子元素当前状态的视图不是叠层示范。真正展示叠层的在GameView// 来源entry/src/main/ets/pages/Index.ets GameView() Stack() { // 第 1 层棋盘背景网格 Column() { ForEach([0, 1, 2, 3, 4], (row: number) { Row() { ForEach([0, 1, 2, 3, 4, 1, 2, 3], (col: number) { Stack() { Text().fontSize(20) } .width(${100 / COLS}%).height(${100 / ROWS}%) .backgroundColor((row col) % 2 0 ? #F0F4F8 : #E6EDF3) }) }.width(100%).height(${100 / ROWS}%) }) }.width(100%).height(100%) // 第 2 层猫咪层绝对定位 Column() { ForEach(this.cats, (cat: Cat) { Text(this.getCatEmoji(cat.level)) .fontSize(30) .position({ x: ${cat.x * 100 / COLS}%, y: ${cat.y * 100 / ROWS}% }) }) }.width(100%).height(100%) // 第 3 层顶部 HUD GameHUD() } .width(100%).height(100%)三层叠结构层内容Z 序定位方式底棋盘背景网格默认最下流式铺满中猫咪层默认中间position绝对定位上顶部 HUD默认最上流式顶部对齐二、Stack 容器核心属性速览Stack是叠层容器子元素自下而上叠后写的在上默认所有子元素居中对齐。2.1 本篇用到的属性属性类型作用本篇取值widthstring | number容器宽度100%heightstring | number容器高度100%alignContentAlignment 枚举子元素对齐位默认CenterzIndexnumber子元素层序0/1/2 控序2.2 Stack vs Row/Column 区别容器子元素排列默认对齐适用Row横排依次VerticalAlign.Center横排布局Column竖排依次HorizontalAlign.Center竖排布局Stack叠层Z 轴Alignment.Center叠层、覆盖、绝对定位记忆Row/Column是「排」Stack是「叠」——排是二维布局叠是 Z 轴层序。三、alignContent 9 位对齐Alignment枚举 9 值3×3 网格枚举水平垂直说明TopStart左顶左上角Top中顶顶部居中TopEnd右顶右上角Start左中左居中Center中中居中默认End右中右居中BottomStart左底左下角Bottom中底底部居中BottomEnd右底右下角3.1 游戏页用默认 CenterStack() { Column() { /* 棋盘 */ }.width(100%).height(100%) Column() { /* 猫咪 */ }.width(100%).height(100%) GameHUD() } .width(100%).height(100%) // alignContent 不写默认 Center棋盘和猫咪层都width(100%).height(100%)鲺满alignContent无所谓——满铺就对齐。HUD 不铺满默认居中——但 HUD 要顶部对齐所以实战中要改Stack() { Column() { /* 棋盘 */ }.width(100%).height(100%) Column() { /* 猫咪 */ }.width(100%).height(100%) GameHUD() } .width(100%).height(100%) .alignContent(Alignment.Top) // HUD 顶部居中3.2 全屏遮罩用 CenterStack() { GameView() // 游戏页 PauseOverlay() // 暂停遮罩 } .alignContent(Alignment.Center) // 遮罩居中盖PauseOverlay是个半透明黑色Column居中盖在GameView上。四、zIndex 显式控层序默认 Stack 子元素后写的在上。要打破书写顺序用zIndexStack() { Column() { /* 棋盘背景 */ }.width(100%).height(100%).zIndex(0) Column() { /* 猫咪层 */ }.width(100%).height(100%).zIndex(1) GameHUD().zIndex(2) PauseOverlay().zIndex(3) // 暂停遮罩最上 }zIndex 规则数值越大越在上0 最底3 最顶。不设默认 0同 0 时后写在上。负值合法zIndex(-1)沉到所有默认 0 之下。何时显式设 zIndex状态遮罩必须最上zIndex(10)。HUD 常驻上层zIndex(5)。背景层沉底zIndex(0)或不设。提示别滥用 zIndex。多数场景靠书写顺序后写在上就够显式设 zIndex 是为了「后写但要在下」的反序情况。五、position 绝对定位猫咪层的猫咪不靠流式布局靠position绝对定位到棋盘格Text(this.getCatEmoji(cat.level)) .fontSize(30) .position({ x: ${cat.x * 100 / COLS}%, y: ${cat.y * 100 / ROWS}% })5.1 position 接受对象.position({ x: number | string, y: number | string })x距左上角水平偏移支持 vp 数字或百分比字符串。y距左上角垂直偏移同上。关键position是相对于父容器左上角父容器必须是Stack或定位容器Column/Row里用position会脱离流式布局但定位基准仍是父左上角。5.2 百分比定位的响应式.position({ x: ${cat.x * 100 / COLS}%, y: ${cat.y * 100 / ROWS}% })猫咪cat.x 2列数COLS 5则x 40%——无论屏宽多少猫咪都落在第 3 列40% 处。百分比定位是响应式绝对定位的甜区。5.3 vp 定位的固定尺寸.position({ x: 100, y: 200 }) // 距左 100vp距顶 200vp固定 vp 定位不响应屏宽适合固定尺寸棋盘如棋盘格子固定 60vp。六、实战 1三层叠游戏页Stack() { // 第 1 层棋盘背景 Column() { ForEach([0, 1, 2, 3, 4], (row: number) { Row() { ForEach([0, 1, 2, 3, 4, 1, 2, 3], (col: number) { Stack() { Text().fontSize(20) } .width(${100 / COLS}%).height(${100 / ROWS}%) .backgroundColor((row col) % 2 0 ? #F0F4F8 : #E6EDF3) }) }.width(100%).height(${100 / ROWS}%) }) }.width(100%).height(100%).zIndex(0) // 第 2 层猫咪层绝对定位 Column() { ForEach(this.cats, (cat: Cat) { Text(this.getCatEmoji(cat.level)) .fontSize(30) .position({ x: ${cat.x * 100 / COLS}%, y: ${cat.y * 100 / ROWS}% }) }) }.width(100%).height(100%).zIndex(1) // 第 3 层顶部 HUD GameHUD().zIndex(2) } .width(100%).height(100%) .alignContent(Alignment.Top)七、实战 2全屏暂停遮罩Builder PauseOverlay() { Column() { Text(游戏暂停).fontSize(32).fontWeight(FontWeight.Bold).fontColor(#FFFFFF).margin({ bottom: 32 }) Button(继续游戏) .width(70%).height(56).fontSize(18).fontColor(#FFFFFF) .backgroundColor(#2ECC71).borderRadius(28) .margin({ bottom: 16 }) .onClick(() { this.gameState GameState.PLAYING; }) Button(重新开始) .width(70%).height(56).fontSize(18).fontColor(#FFFFFF) .backgroundColor(#E74C3C).borderRadius(28) .onClick(() { this.clearTimers(); this.startGame(); }) } .width(100%).height(100%) .backgroundColor(rgba(0,0,0,0.7)) // 半透明黑遮罩 .alignItems(HorizontalAlign.Center) .justifyContent(FlexAlign.Center) } // 使用叠在 GameView 上 Stack() { GameView() if (this.gameState GameState.PAUSED) { PauseOverlay() } }遮罩三要点width(100%).height(100%)齔屏遮盖。rgba(0,0,0,0.7)半透明黑让下层游戏隐约可见。justifyContent(Center) alignItems(Center)遮罩内部按钮居中。八、实战 3居中浮弹窗Stack() { GameView() // 居中浮弹窗非全屏遮罩 Column() { Text(确认重新开始).fontSize(18).fontColor(#2C3E50).margin({ bottom: 24 }) Row({ space: 12 }) { Button(取消).width(100).height(44).backgroundColor(#95A5A6).fontColor(#FFFFFF).borderRadius(22) Button(确认).width(100).height(44).backgroundColor(#E74C3C).fontColor(#FFFFFF).borderRadius(22) } } .width(70%).padding(24) .backgroundColor(#FFFFFF).borderRadius(16) .shadow({ radius: 16, color: rgba(0,0,0,0.3), offsetY: 4 }) } .alignContent(Alignment.Center) // 弹窗居中弹窗 vs 遮罩差异维度全屏遮罩居中弹窗宽高100%/100%70%/auto底色rgba(0,0,0,0.7)#FFFFFF对齐内部居中容器居中alignContent阴影无有浮起感九、调试技巧叠层怎么量加临时 border给每层加不同色 border红/蓝/绿看清层叠边界。zIndex验层序遮罩没盖住游戏查 zIndex 是否比游戏大。position验基准猫咪定位偏父容器是否Stackposition基准是否父左上角。真机看遮罩透明预览器渲染接近真机但rgba透明度可能差异以真机为准。十、性能与最佳实践Stack层数别超 5每层都是独立子树超过 5 层布局计算开销显著。zIndex别跳数用 0/1/2/3 连续别 0/10/100/1000 跳——视觉无差异还难维护。position配Stack绝对定位在Stack里最自然在Column/Row里会脱离流式但基准仍是父。遮罩rgba透明度 0.6–0.8低于 0.6 下层太清晰不像遮罩高于 0.8 太黑看不见下层。总结本篇我们从游戏页Stack根布局切入掌握Stack的alignContent9 位、zIndex层序、position绝对定位三大要点并给出了三层游戏页、全屏暂停遮罩、居中浮弹窗三种叠层布局的完整代码。核心要点Stack 是叠非排后写在上 zIndex 破序position 配 Stack 做绝对定位遮罩 100% rgba 0.7。下一篇我们将继续主菜单拆解if/else状态驱动的页面切换机制。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源「猫猫大作战」项目源码本仓库entry/src/main/ets/pages/Index.etsStack 容器官方指南Stack API 参考Alignment 枚举开源鸿蒙跨平台社区HarmonyOS 开发者官方文档首页系列索引本仓库articles/INDEX.md

相关新闻

C#的异步编程模型:从Task到async/await的实现路径

C#的异步编程模型:从Task到async/await的实现路径

C#的异步编程从APM(异步编程模型)和EAP(基于事件的异步模式)演进到Task和async/await。当前模型在易用性和性能之间取得了较好的平衡,但其底层机制值得深入理解。 一、Task:异步操作的基本单元 Task表示一…

2026/7/28 0:13:48 阅读更多 →
HarmonyOS应用开发实战:猫猫大作战-`Column` 容器的卡片化套路

HarmonyOS应用开发实战:猫猫大作战-`Column` 容器的卡片化套路

前言 主菜单的标题、按钮是「原子元素」,但一个完整界面需要把多个原子组织成卡片。在 HarmonyOS 里,Column(垂直线性容器)是最常用的卡片骨架——它把若干子元素自上而下排列,并通过 padding、backgroundColor、bord…

2026/7/28 0:13:48 阅读更多 →
Kodi播放115网盘视频终极指南:3步实现云端原码播放

Kodi播放115网盘视频终极指南:3步实现云端原码播放

Kodi播放115网盘视频终极指南:3步实现云端原码播放 【免费下载链接】115proxy-for-kodi 115原码播放服务Kodi插件 项目地址: https://gitcode.com/gh_mirrors/11/115proxy-for-kodi 还在为本地存储空间不足而烦恼吗?想要在Kodi媒体中心直接播放11…

2026/7/28 0:13:48 阅读更多 →

最新新闻

智能降重实用技巧分享 高效实现内容原创度提升的靠谱方法指南

智能降重实用技巧分享 高效实现内容原创度提升的靠谱方法指南

本科毕业论文是大学四年最大的坎。开题报告憋一周写不出三页,找文献翻遍十几个网站还是缺关键资料,写正文卡壳半天憋不出一句话,降重改到凌晨三点结果逻辑全乱,答辩前一天PPT还没做完。别慌,亲测这四个工具能让你少熬半…

2026/7/28 0:24:51 阅读更多 →
学术agent续写方法与应用场景解析

学术agent续写方法与应用场景解析

本科毕业论文是大学四年最大的坎。开题报告憋一周写不出三页,找文献翻遍十几个网站还是缺关键资料,写正文卡壳半天憋不出一句话,降重改到凌晨三点结果逻辑全乱,答辩前一天PPT还没做完。别慌,亲测这四个工具能让你少熬半…

2026/7/28 0:24:51 阅读更多 →
《人工智能导论》全套PPT课件2026

《人工智能导论》全套PPT课件2026

《人工智能导论》全套PPT课件2026 课件参考:《人工智能导论》王磊 教材 课件内容: 第1章绪论.pptx 第2章知识表示-pptx 第3章推理方法.pptx 第4章搜索技术与问题求解.pptx 第5章 智能优化算法.pptx 第6章 机器学习.pptx 第7章人工神经网络.pptx 第8章感知…

2026/7/28 0:24:51 阅读更多 →
SpringBoot 整合 Sentinel——流量控制与熔断降级

SpringBoot 整合 Sentinel——流量控制与熔断降级

Sentinel 是阿里巴巴开源的流量控制组件,相比 Hystrix 功能更丰富、性能更好。支持限流、熔断、系统保护等多种能力。 一、为什么选 Sentinel对比SentinelHystrix限流模式直接、冷启动、匀速线程池/信号量熔断策略慢比、异常比、异常数错误率控制台✅ 可视化配置❌ …

2026/7/28 0:24:51 阅读更多 →
AI精准搜索:高效获取精准信息的新一代智能检索工具指南

AI精准搜索:高效获取精准信息的新一代智能检索工具指南

本科毕业论文是大学四年最大的坎。开题报告憋一周写不出三页,找文献翻遍十几个网站还是缺关键资料,写正文卡壳半天憋不出一句话,降重改到凌晨三点结果逻辑全乱,答辩前一天PPT还没做完。别慌,亲测这四个工具能让你少熬半…

2026/7/28 0:24:51 阅读更多 →
DeepSeek    LeetCode 3753. 范围内总波动值 II JavaScript实现

DeepSeek LeetCode 3753. 范围内总波动值 II JavaScript实现

对于 LeetCode 3753 这道困难题,核心解法是数位 DP,配合前缀和技巧:F(num2) - F(num1-1)。以下是基于该思路的 JavaScript 实现。javascript /*** param {number} num1* param {number} num2* return {number}*/ var totalWaviness function…

2026/7/28 0:23:51 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻