【HarmonyOS 5】鸿蒙中常见的标题栏布局方案

简介: 【HarmonyOS 5】鸿蒙中常见的标题栏布局方案

## 【HarmonyOS 5】鸿蒙中常见的标题栏布局方案

##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财#

## 一、问题背景:



鸿蒙中常见的标题栏:矩形区域,左边是返回按钮,右边是问号帮助按钮,中间是标题文字。


金融类应用对标题栏的要求更为严苛:一方面需保证导航功能的稳定性(返回按钮必须触达便捷),另一方面要兼顾品牌调性(标题文字需清晰突出),同时帮助按钮需易于发现(便于用户获取理财指引)。


理想的标题栏应满足:

- 跨设备适配(手机、平板等多终端显示一致)

- 组件对齐精准(垂直居中、水平间距合理)

- 交互反馈清晰(按钮点击有明确状态变化)

- 扩展灵活(可快速添加用户头像、通知图标等元素)



那有几种布局方式,分别怎么布局呢?常见的思维是,有老铁使用row去布局,怎么都对不齐。

## 二、解决方案


### 方案一:Flex布局(推荐首选)


Flex布局(弹性布局)是鸿蒙中处理线性排列的最佳选择,通过`justifyContent`和`alignItems`属性可轻松实现组件的均匀分布与居中对齐,尤其适合响应式场景。

利用`Flex`容器的`Row`方向(默认水平排列),通过`SpaceBetween`使三个组件(返回按钮、标题、帮助按钮)在水平方向上两端对齐、中间自适应;`alignItems`设置为`Center`确保垂直方向居中。这种布局会自动分配剩余空间,在不同屏幕尺寸下保持组件相对位置稳定。


#### 代码实现

```typescript

@Entry

@Component

struct FinanceTitleBar {

 // 标题文字可动态修改(适应不同页面)

 @State title: string = "我的资产"


 build() {

   Column() {

     // 标题栏主体

     Flex({

       direction: FlexDirection.Row,

       justifyContent: FlexAlign.SpaceBetween,

       alignItems: ItemAlign.Center

     }) {

       // 左侧返回按钮:添加水波纹效果增强交互感

       Button({ type: ButtonType.Circle, stateEffect: true }) {

         Image($r("app.media.ic_back")) // 使用实际返回图标

           .width(24)

           .height(24)

           .fillColor("#333333")

       }

       .width(40)

       .height(40)

       .backgroundColor("transparent")

       .onClick(() => {

         // 金融应用中返回可能需要确认(如表单未保存)

         router.back()

       })


       // 中间标题:金融场景建议加粗突出

       Text(this.title)

         .fontSize(18)

         .fontWeight(FontWeight.Medium)

         .fontColor("#1A1A1A")

         .maxLines(1) // 防止标题过长换行

         .textOverflow({ overflow: TextOverflow.Ellipsis })


       // 右侧帮助按钮:圆形设计符合金融应用的安全感

       Button({ type: ButtonType.Circle, stateEffect: true }) {

         Image($r("app.media.ic_help")) // 使用实际帮助图标

           .width(24)

           .height(24)

           .fillColor("#333333")

       }

       .width(40)

       .height(40)

       .backgroundColor("transparent")

       .onClick(() => {

         // 跳转至帮助中心(金融应用常见需求)

         router.pushUrl({ url: "pages/HelpPage" })

       })

     }

     .width('100%')

     .height(56) // 符合鸿蒙设计规范的标题栏高度

     .padding({ left: 16, right: 16 }) // 左右边距适配触摸区域

     .backgroundColor("#FFFFFF")

     .shadow({ radius: 2, color: "#00000010" }) // 底部阴影增强层次感


     // 页面内容区域(示例)

     Text("资产详情内容...")

       .flexGrow(1)

       .padding(16)

   }

   .width('100%')

   .height('100%')

   .backgroundColor("#F5F5F5")

 }

}

```



### 方案二:Stack布局(精准定位场景)


Stack布局(堆叠布局)通过层级叠加组件,适合需要精确定位的场景。核心思路是将标题文字固定在中心,返回按钮与帮助按钮通过绝对定位放置在两侧。


Stack容器默认将子组件堆叠显示,通过`alignContent: Alignment.Center`使标题文字居中;按钮组件通过`position`属性设置x轴坐标(左侧按钮距左16vp,右侧按钮距右16vp),y轴坐标设为0实现垂直居中。


#### 代码实现

```typescript

@Entry

@Component

struct StackTitleBar {

 @State title: string = "理财产品"


 build() {

   Column() {

     Stack({ alignContent: Alignment.Center }) {

       // 中间标题:优先渲染在底层,确保不被按钮遮挡

       Text(this.title)

         .fontSize(18)

         .fontWeight(FontWeight.Medium)

         .fontColor("#1A1A1A")


       // 左侧返回按钮:使用绝对定位

       Button({ type: ButtonType.Circle, stateEffect: true }) {

         Image($r("app.media.ic_back"))

           .width(24)

           .height(24)

       }

       .width(40)

       .height(40)

       .backgroundColor("transparent")

       .position({ x: 16, y: 0 }) // x=16贴左,y=0垂直居中

       .onClick(() => {

         router.back()

       })


       // 右侧帮助按钮:通过计算右间距定位

       Button({ type: ButtonType.Circle, stateEffect: true }) {

         Image($r("app.media.ic_help"))

           .width(24)

           .height(24)

       }

       .width(40)

       .height(40)

       .backgroundColor("transparent")

       .position({ x: "calc(100% - 56vp)", y: 0 }) // 100%宽度减去按钮宽(40)和右距(16)

       .onClick(() => {

         router.pushUrl({ url: "pages/HelpPage" })

       })

     }

     .width('100%')

     .height(56)

     .backgroundColor("#FFFFFF")

     .shadow({ radius: 2, color: "#00000010" })


     // 页面内容

     Text("理财产品列表...")

       .flexGrow(1)

       .padding(16)

   }

   .width('100%')

   .height('100%')

   .backgroundColor("#F5F5F5")

 }

}

```



### 方案三:Row+Column组合布局(复杂扩展场景)


当标题栏需要包含更多元素(如用户头像、多按钮组)时,可采用Row嵌套Column的组合布局,通过权重分配实现灵活排列。

外层用Row作为主容器,内部划分三个区域:左侧区域(返回按钮)、中间区域(标题)、右侧区域(帮助按钮+用户头像),每个区域通过`flexGrow`设置权重(左侧和右侧权重为0,中间权重为1,确保标题占满剩余空间)。


#### 代码实现

```typescript

@Entry

@Component

struct ComplexTitleBar {

 @State title: string = "账户设置"

 @State userName: string = "张**" // 金融应用隐藏部分姓名


 build() {

   Column() {

     Row() {

       // 左侧区域:仅返回按钮

       Row() {

         Button({ type: ButtonType.Circle, stateEffect: true }) {

           Image($r("app.media.ic_back"))

             .width(24)

             .height(24)

         }

         .width(40)

         .height(40)

         .backgroundColor("transparent")

         .onClick(() => router.back())

       }

       .flexGrow(0) // 不占用额外空间


       // 中间区域:标题(占满剩余空间)

       Row() {

         Text(this.title)

           .fontSize(18)

           .fontWeight(FontWeight.Medium)

       }

       .flexGrow(1) // 权重1,占满剩余空间

       .justifyContent(FlexAlign.Center) // 内部居中


       // 右侧区域:帮助按钮+用户头像

       Row({ space: 12 }) { // 按钮间间距12vp

         Button({ type: ButtonType.Circle, stateEffect: true }) {

           Image($r("app.media.ic_help"))

             .width(24)

             .height(24)

         }

         .width(40)

         .height(40)

         .backgroundColor("transparent")

         .onClick(() => router.pushUrl({ url: "pages/HelpPage" }))


         // 金融应用常见:用户头像

         Image($r("app.media.ic_avatar"))

           .width(36)

           .height(36)

           .borderRadius(18) // 圆形头像

           .onClick(() => router.pushUrl({ url: "pages/UserPage" }))

       }

       .flexGrow(0)

       .alignItems(ItemAlign.Center)

     }

     .width('100%')

     .height(56)

     .padding({ left: 16, right: 16 })

     .backgroundColor("#FFFFFF")

     .shadow({ radius: 2, color: "#00000010" })


     // 页面内容

     Text("账户安全设置...")

       .flexGrow(1)

       .padding(16)

   }

   .width('100%')

   .height('100%')

   .backgroundColor("#F5F5F5")

 }

}

```

目录
相关文章
|
4月前
|
物联网 开发工具
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
121 9
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
|
4月前
|
消息中间件 物联网 开发工具
【HarmonyOS 5】鸿蒙中如何使用MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级、基于发布 / 订阅(Publish/Subscribe)模式的即时通讯协议,专为资源受限的物联网(IoT)设备和低带宽、高延迟或不可靠网络环境设计。
238 0
|
移动开发 安全 Android开发
【HarmonyOS 5】鸿蒙mPaaS详解
mPaaS 是 Mobile Platform as a Service 的缩写,即移动开发平台。
291 0
|
缓存 数据安全/隐私保护 JavaScript
【HarmonyOS 5】鸿蒙页面和组件生命周期函数
【HarmonyOS 5】鸿蒙页面和组件生命周期函数
176 0
|
4月前
|
前端开发 JavaScript API
【HarmonyOS 5】鸿蒙跨平台开发方案详解(一)
2025年是鸿蒙生态迎来关键发展期。根据前几天的2025 HDC数据显示,鸿蒙原生应用数量已从2024年的2000款增长至5000款,微信鸿蒙版安装量突破1.2亿,公安部交管系统完成全国300城鸿蒙适配。
302 1
|
4月前
|
存储 安全 API
【HarmonyOS 5】鸿蒙应用隐私保护详解
【HarmonyOS 5】鸿蒙应用隐私保护详解
163 1
|
4月前
|
开发工具
【HarmonyOS 5】使用openCustomDialog如何禁止手势关闭的方案
openCustomDialog提供了onWillDismiss回调函数,当用户尝试通过滑动、点击外部、返回键等操作关闭弹窗时,会触发该回调。通过在回调中判断关闭原因并拦截操作,即可实现禁止手势关闭的效果。
125 1
|
4月前
|
传感器 自动驾驶 物联网
【HarmonyOS 5】鸿蒙星闪NearLink详解
鸿蒙星闪NearLink Kit 是 HarmonyOS 提供的短距离通信服务,支持星闪设备间的连接、数据交互。例如,手机可作为中心设备与外围设备(如鼠标、手写笔、智能家电、车钥匙等)通过星闪进行连接。
130 0
|
4月前
|
移动开发 Dart 前端开发
【HarmonyOS 5】鸿蒙跨平台开发方案详解(二)
作为最早实现鸿蒙适配的跨平台框架,Flutter在社区推动下已形成较完整的技术方案。当前鸿蒙版Flutter已发布3.22.0-ohos版本,该版本基于Flutter 3.22.0核心。
264 0
|
4月前
|
监控 JavaScript 开发工具
【HarmonyOS 5】鸿蒙中@State的原理详解
@State 是 HarmonyOS ArkTS 框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动 UI 的响应式编程模式。通过将变量标记为 @State,开发者可以确保当状态值发生变化时,依赖该状态的 UI 组件会自动重新渲染,从而保持数据与界面的实时同步。 @State 是 HarmonyOS ArkTS 实现响应式编程的大基础核心,可以说整个V1和V2都是围绕它来进行组合使用。
166 0