50.[HarmonyOS NEXT RelativeContainer案例七] 均匀分布的底部导航栏:水平链布局技术详解

简介: 底部导航栏是移动应用中最常见的导航元素之一,它通常包含多个均匀分布的图标或按钮,用于在应用的主要功能之间切换。在HarmonyOS NEXT中,RelativeContainer组件提供了强大的链式布局(Chain)功能,能够轻松实现元素的均匀分布,非常适合底部导航栏的实现。本教程将详细讲解如何利用RelativeContainer的水平链布局功能实现一个美观、均匀分布的底部导航栏。


项目已开源,开源地址: https://gitcode.com/nutpi/HarmonyosNextCaseStudyTutorial , 欢迎fork & star

效果演示

1. 引言

底部导航栏是移动应用中最常见的导航元素之一,它通常包含多个均匀分布的图标或按钮,用于在应用的主要功能之间切换。在HarmonyOS NEXT中,RelativeContainer组件提供了强大的链式布局(Chain)功能,能够轻松实现元素的均匀分布,非常适合底部导航栏的实现。本教程将详细讲解如何利用RelativeContainer的水平链布局功能实现一个美观、均匀分布的底部导航栏。

2. 链式布局(Chain)概述

链式布局是RelativeContainer提供的一种特殊的布局方式,它可以将一组组件按照特定的方式排列在一条直线上,并控制它们之间的间距和分布方式。链式布局可以是水平的或垂直的,并支持多种分布模式。

2.1 链式布局的特性

  • 方向性:可以是水平的或垂直的
  • 分布模式:支持多种分布方式,如均匀分布、两端对齐等
  • 组件连接:将多个组件连接成一条链
  • 自动间距:根据分布模式自动计算组件之间的间距

3. 案例分析:底部导航栏

3.1 完整代码

@Component
export struct BottomNav {
    build() {
        RelativeContainer() {
            // 首页图标
            Image($r('app.media.home'))
                .width(24)
                .height(24)
                .id("home")
                .alignRules({
                    left: { anchor: "parent", align: HorizontalAlign.Start },
                    bottom: { anchor: "parent", align: VerticalAlign.Bottom }
                })
            // 消息图标
            Image($r('app.media.message'))
                .width(24)
                .height(24)
                .id("message")
                .alignRules({
                    left: { anchor: "parent", align: HorizontalAlign.Center },
                    bottom: { anchor: "parent", align: VerticalAlign.Bottom }
                })
            // 我的图标
            Image($r('app.media.profile'))
                .width(24)
                .height(24)
                .id("profile")
                .alignRules({
                    left: { anchor: "parent", align: HorizontalAlign.End },
                    bottom: { anchor: "parent", align: VerticalAlign.Bottom }
                })
        }
        .chainMode([
            {
                id: "horizontalChain",
                direction: Direction.HORIZONTAL,
                style: ChainStyle.SPREAD,
                components: ["home", "message", "profile"]
            }
        ])
        .width('100%')
        .height(56)
        .backgroundColor('#ffffff')
    }
}

3.2 代码详解

3.2.1 RelativeContainer容器设置

RelativeContainer() {
    // 子组件
}
.chainMode([
    {
        id: "horizontalChain",
        direction: Direction.HORIZONTAL,
        style: ChainStyle.SPREAD,
        components: ["home", "message", "profile"]
    }
])
.width('100%')
.height(56)
.backgroundColor('#ffffff')

这部分代码创建了一个RelativeContainer容器,并设置了以下属性:

属性

说明

chainMode

[...]

定义链式布局数组

width

'100%'

容器宽度为父容器的100%

height

56

容器高度为56vp

backgroundColor

'#ffffff'

背景色为白色

这里的关键是chainMode属性,它定义了一个水平链:

  • id: "horizontalChain" - 链的唯一标识符
  • direction: Direction.HORIZONTAL - 链的方向为水平
  • style: ChainStyle.SPREAD - 链的样式为均匀分布
  • components: ["home", "message", "profile"] - 链中包含的组件ID数组

这个水平链将三个图标组件连接起来,并使它们在容器中均匀分布。

3.2.2 首页图标设置

Image($r('app.media.home'))
    .width(24)
    .height(24)
    .id("home")
    .alignRules({
        left: { anchor: "parent", align: HorizontalAlign.Start },
        bottom: { anchor: "parent", align: VerticalAlign.Bottom }
    })

首页图标的关键属性设置:

属性

说明

width

24

宽度为24vp

height

24

高度为24vp

id

"home"

组件的唯一标识符,用于链式布局引用

alignRules.left

{ anchor: "parent", align: HorizontalAlign.Start }

左侧对齐父容器的左侧

alignRules.bottom

{ anchor: "parent", align: VerticalAlign.Bottom }

底部对齐父容器的底部

这里的关键点是为首页图标设置了一个唯一的ID "home",这样链式布局就可以引用它。同时,图标被定位在容器的左下角。

3.2.3 消息图标设置

Image($r('app.media.message'))
    .width(24)
    .height(24)
    .id("message")
    .alignRules({
        left: { anchor: "parent", align: HorizontalAlign.Center },
        bottom: { anchor: "parent", align: VerticalAlign.Bottom }
    })

消息图标的关键属性设置:

属性

说明

width

24

宽度为24vp

height

24

高度为24vp

id

"message"

组件的唯一标识符,用于链式布局引用

alignRules.left

{ anchor: "parent", align: HorizontalAlign.Center }

左侧对齐父容器的中心

alignRules.bottom

{ anchor: "parent", align: VerticalAlign.Bottom }

底部对齐父容器的底部

消息图标被定位在容器的底部中心位置。

3.2.4 我的图标设置

Image($r('app.media.profile'))
    .width(24)
    .height(24)
    .id("profile")
    .alignRules({
        left: { anchor: "parent", align: HorizontalAlign.End },
        bottom: { anchor: "parent", align: VerticalAlign.Bottom }
    })

我的图标的关键属性设置:

属性

说明

width

24

宽度为24vp

height

24

高度为24vp

id

"profile"

组件的唯一标识符,用于链式布局引用

alignRules.left

{ anchor: "parent", align: HorizontalAlign.End }

左侧对齐父容器的右侧

alignRules.bottom

{ anchor: "parent", align: VerticalAlign.Bottom }

底部对齐父容器的底部

我的图标被定位在容器的右下角。

4. 链式布局的高级应用

4.1 链式布局样式

RelativeContainer提供了多种链式布局样式:

链式样式

说明

效果

ChainStyle.SPREAD

均匀分布,组件之间的间距相等

组件均匀分布在容器中

ChainStyle.SPREAD_INSIDE

两端对齐,首尾组件贴近容器边缘,中间组件均匀分布

首尾组件贴边,中间均匀分布

ChainStyle.PACKED

紧凑排列,组件紧密排列在一起

组件紧密排列在容器中心

4.2 链式布局偏移

可以通过设置链的偏移(bias)来调整链在容器中的位置:

.chainMode([
    {
        id: "horizontalChain",
        direction: Direction.HORIZONTAL,
        style: ChainStyle.SPREAD,
        components: ["home", "message", "profile"],
        bias: 0.3 // 链向左偏移
    }
])

4.3 垂直链式布局

除了水平链,还可以创建垂直链:

.chainMode([
    {
        id: "verticalChain",
        direction: Direction.VERTICAL,
        style: ChainStyle.SPREAD,
        components: ["button1", "button2", "button3"]
    }
])

4.4 多链组合

可以在同一个容器中定义多个链,实现复杂的布局:

.chainMode([
    {
        id: "horizontalChain1",
        direction: Direction.HORIZONTAL,
        style: ChainStyle.SPREAD,
        components: ["home", "message", "profile"]
    },
    {
        id: "verticalChain1",
        direction: Direction.VERTICAL,
        style: ChainStyle.SPREAD,
        components: ["header", "content", "footer"]
    }
])

5. 底部导航栏的最佳实践

5.1 导航项的布局

底部导航栏通常包含图标和文本标签,可以使用以下方式布局:

布局方式

实现方法

图标在上,文本在下

使用垂直链连接每个导航项的图标和文本

只显示图标

只使用图标组件,通过水平链均匀分布

图标和文本并排

使用水平链连接图标和文本,再使用另一个水平链连接多个导航项

5.2 导航项的选中状态

可以通过状态变量控制导航项的选中状态:

@State currentTab: number = 0;
// 在构建函数中
Image(this.currentTab === 0 ? $r('app.media.home_selected') : $r('app.media.home'))
    .width(24)
    .height(24)
    .id("home")
    .onClick(() => {
        this.currentTab = 0;
    })

6. 实际应用场景

水平链布局在以下场景中特别有用:

  1. 底部导航栏:均匀分布的导航图标
  2. 工具栏:均匀分布的工具按钮
  3. 标签页:均匀分布的标签
  4. 评分组件:均匀分布的星星图标

7. 总结

链式布局是RelativeContainer提供的强大功能,特别适合创建均匀分布的组件布局。

相关文章
|
25天前
|
测试技术 开发工具 开发者
HarmonyOS Next快速入门:了解项目工程目录结构
本教程旨在帮助开发者快速上手HarmonyOS应用开发,涵盖从环境搭建到工程创建的全流程。通过DevEco Studio创建首个项目时,选择“Application”与“Empty Ability”,配置项目名称、包名、保存路径等关键信息后完成创建。代码示例展示了基本UI组件的使用,如`Hello World`文本显示与交互逻辑。此外,详细解析了工程目录结构,包括AppScope自动生成规则、主模块(entry)的功能划分、依赖配置文件(oh-package.json5)的作用,以及app.json5中包名、版本号等全局配置项的含义。
64 5
|
20天前
|
开发者 UED
HarmonyOS Next快速入门:通用属性
本教程以《HarmonyOS Next快速入门》为基础,涵盖应用开发核心技能。通过代码实例讲解尺寸、位置、布局约束、Flex布局、边框、背景及图像效果等属性设置方法。如`.width()`调整宽度,`.align()`设定对齐方式,`.border()`配置边框样式,以及模糊、阴影等视觉效果的实现。结合实际案例,帮助开发者掌握HarmonyOS组件属性的灵活运用,提升开发效率与用户体验。适合初学者及进阶开发者学习。
61 0
|
20天前
|
开发者
HarmonyOS Next快速入门:通用事件
本教程聚焦HarmonyOS应用开发,涵盖事件处理的核心内容。包括事件分发、触屏事件、键鼠事件、焦点事件及拖拽事件等。通过代码实例讲解点击事件、触控事件(Down/Move/Up)、获焦与失焦事件的处理逻辑,以及气泡弹窗的应用。适合开发者快速掌握HarmonyOS Next中通用事件的使用方法,提升应用交互体验。
60 0
|
20天前
|
开发者 容器
HarmonyOS Next快速入门:Button组件
本教程摘自《HarmonyOS Next快速入门》,聚焦HarmonyOS应用开发中的Button组件。Button支持胶囊、圆形和普通三种类型,可通过子组件实现复杂功能,如嵌入图片或文字。支持自定义样式(边框弧度、文本样式、背景色等)及点击事件处理。示例代码展示了不同类型按钮的创建与交互逻辑,助开发者快速上手。适合HarmonyOS初学者及对UI组件感兴趣的开发者学习。
66 0
|
20天前
|
开发者
HarmonyOS Next快速入门:Image组件
本教程摘自《HarmonyOS Next快速入门》,专注于HarmonyOS应用开发中的Image组件使用。Image组件支持多种图片格式(如png、jpg、svg等),可渲染本地资源、网络图片、媒体库文件及PixelMap像素图。通过设置`objectFit`属性,实现不同缩放类型;利用`fillColor`属性调整矢量图颜色。示例代码涵盖本地、网络及资源图片的加载与样式设置,同时需在`module.json5`中声明网络权限以加载外部资源。适合开发者快速掌握HarmonyOS图像展示功能。
72 0
|
1月前
|
监控 JavaScript 前端开发
🎉 Harmony OS Next里的Web组件:网页加载的全流程掌控手册
本文详细解析了Harmony OS Next中ArkUI Web组件的九大生命周期回调,帮助开发者全面掌控网页加载流程。从组件初始化到加载完成,再到异常处理与性能优化,每个阶段都配有具体代码示例和注意事项。内容涵盖关键回调(如aboutToAppear、onPageBegin)的使用场景、网页加载进度监控(FCP/FMP/LCP)、以及前端页面优化实践。通过本文,开发者可以高效管理网页加载过程,提升应用性能与用户体验。
61 0
|
1月前
|
API UED 开发者
Harmony OS Next玩转多层级手势事件:当组件遇上“套娃”,触摸该怎么分家?
在HarmonyOS开发中,处理多层级手势事件是一项挑战,尤其在“组件套组件”的复杂布局下。本文深入探讨了触摸事件的基础原理、父子组件间的手势竞争规则以及如何通过`responseRegion`和`hitTestBehavior`等属性自定义触摸分发逻辑。同时介绍了`.gesture()`、`.priorityGesture()`和`.parallelGesture()`三种手势绑定方法,帮助开发者灵活调整手势优先级。掌握这些技巧,可精准控制复杂交互中的触摸行为,提升用户体验。
37 0
|
容器
HarmonyOS实战—布局和组件的概述
HarmonyOS实战—布局和组件的概述
265 0
HarmonyOS实战—布局和组件的概述
|
26天前
|
开发者
鸿蒙开发:资讯项目实战之项目初始化搭建
目前来说,我们的资讯项目只是往前迈了很小的一步,仅仅实现了项目创建,步虽小,但概念性的知识很多,这也是这个项目的初衷,让大家不仅仅可以掌握日常的技术开发,也能让大家理解实际的项目开发知识。
鸿蒙开发:资讯项目实战之项目初始化搭建
|
20天前
|
缓存 JavaScript IDE
鸿蒙开发:基于最新API,如何实现组件化运行
手动只是让大家了解切换的原理,在实际开发中,可不推荐手动,下篇文章,我们将通过脚本或者插件,快速实现组件化模块之间的切换,实现独立运行,敬请期待!
鸿蒙开发:基于最新API,如何实现组件化运行