HarmonyOS 7的页面UI布局设计延续并强化了其"一次开发,多端部署"的理念,其核心在于通过原子化、响应式的布局能力,实现跨设备的自适应展示。一个典型的页面布局通常可以拆解为以下几个层次和组件:
1. 页面整体结构
通常采用 Column 或 Row 作为根容器,结合 Scroll 组件处理内容溢出,形成流式布局。
typescript
// 示例:一个典型页面的ArkTS结构
@Entry
@Component
struct SamplePage {
build() {
Column() {
// 1. 顶部导航/标题栏 this.TopBar()
// 2. 主要内容区,可滚动
Scroll() {
Column() {
// 3. 各个功能区块卡片 this.HeroSection()
this.FunctionGrid()
this.ContentList()
}
.width('100%')
.padding(12)
}
.layoutWeight(1) // 关键:使Scroll占据剩余空间
// 4. 底部导航栏
this.BottomTabBar()
}
.width('100%')
.height('100%')
.backgroundColor($r('app.color.background'))
}
}
2. 核心布局组件与设计模式
| 组件/模式 | 作用与特点 | 实现关键 |
|---|---|---|
| 弹性布局 (Flex) | 实现子元素的均分、对齐和自动换行,常用于标签区、指标行。 | 使用 Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) 控制对齐。 |
| 自适应宽度 (layoutWeight) | 使组件在容器中按权重分配剩余空间,是实现弹性布局的核心。 | 在 Text()或 Column() 上设置 .layoutWeight(1),使其自适应填充。 |
| 卡片式设计 (Card) | 将信息封装在具有圆角、阴影和内边距的容器中,提升视觉层次和模块化。 | 使用 Column 或 Row 配合 .borderRadius(24)、.padding(16)、.backgroundColor(Color.White) 和 .shadow 样式模拟。 |
| 列表与循环渲染 | 高效展示重复结构的数据,如商品列表、待办事项。 | 使用 ForEach 遍历数组,为每个数据项渲染相同的UI结构。 |
| 响应式栅格 | 在不同屏幕尺寸下自动调整列数和间距,常用于功能入口网格。 | 结合 GridRow、GridCol 组件和断点系统实现。 |
3.典型UI模块拆解
以参考案例中常见的模块为例:
-
筛选/标签栏 :常使用"药丸式"交互设计,通过
Flex布局实现水平滚动或换行的标签集合,每个标签是一个具有圆角和边框的Text组件。 -
信息卡片 (如 PersonDetailCard) :
typescriptImage($r('app.media.avatar')) // 左侧头像 .width(60) .height(60) .borderRadius(30) Column() { Text('姓名') .fontSize(18) .fontWeight(FontWeight.Medium) Text('详细信息...') .fontSize(14) .opacity(0.6) // 标签区,使用Flex自动换行 Flex({ wrap: FlexWrap.Wrap }) { ForEach(this.tags, (item) => { Text(item) .padding({ left: 8, right: 8, top: 4, bottom: 4 }) .borderRadius(15) // 药丸样式 .backgroundColor($r('app.color.tag_bg')) }) } } .layoutWeight(1) // 右侧文本部分自适应宽度 .margin({ left: 12 }) } .padding(16) .borderRadius(16) .backgroundColor(Color.White) .shadow(...) -
功能入口网格 :使用
GridRow和GridCol或通过Flex嵌套实现等宽图标+文字的网格布局,确保在不同屏幕宽度下保持合理的列数。 -
列表项 (如 InteractionRecordCard) :通常为三段式水平结构,包含左侧图标/头像、中间自适应标题与详情文字、右侧操作按钮或辅助信息,中间部分使用
layoutWeight(1)实现自适应。
4. 一多开发与自适应要点
- 原子化布局:将布局属性(如间距、圆角)定义为系统级或项目级的常量,确保多端一致性。
- 响应式设计 :利用ArkUI的断点系统(如
sm,md,lg)和百分比、vp/fp单位,使布局能根据容器尺寸动态调整。 - 资源动态加载:根据不同设备的屏幕密度、语言等,动态加载对应的图片、字符串等资源。
5. 视觉与交互细节
- 间距系统 :采用
4vp或8vp的倍数作为基础间距单位,形成规律的视觉节奏。 - 语义化颜色 :通过
Theme工具类或资源引用(如$r('app.color.primary'))管理颜色,轻松适配明暗模式。 - 图标与文字规范 :图标常用
44×44圆角方形尺寸,文字采用阶梯式字号和字重,区分信息层级。