48.[HarmonyOS NEXT RelativeContainer案例五] 精确表单布局:辅助线定位技术打造专业级UI

简介: 在HarmonyOS NEXT的UI开发中,表单是常见且重要的界面元素。创建对齐精确、布局合理的表单需要精细的定位控制。RelativeContainer提供的辅助线(Guideline)功能,为表单布局提供了强大的支持。本教程将详细讲解如何使用RelativeContainer的辅助线功能实现精确的表单布局,帮助你掌握这一专业级UI技术。


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

效果演示

1. 引言

在HarmonyOS NEXT的UI开发中,表单是常见且重要的界面元素。创建对齐精确、布局合理的表单需要精细的定位控制。RelativeContainer提供的辅助线(Guideline)功能,为表单布局提供了强大的支持。本教程将详细讲解如何使用RelativeContainer的辅助线功能实现精确的表单布局,帮助你掌握这一专业级UI技术。

2. 辅助线(Guideline)概述

辅助线是RelativeContainer提供的一种虚拟定位工具,它不会在界面上显示,但可以作为组件定位的参考线。辅助线可以是水平的或垂直的,通过指定位置创建,然后其他组件可以相对于辅助线进行定位。

2.1 辅助线的特性

  • 不可见性:辅助线在界面上不可见,仅作为定位参考
  • 方向性:可以是水平的(Axis.Horizontal)或垂直的(Axis.Vertical)
  • 位置控制:可以通过具体数值或百分比设置位置
  • 可复用性:多个组件可以共用同一条辅助线

3. 案例分析:辅助线定位布局

3.1 完整代码

@Component
export struct FormLayout {
    build() {
        RelativeContainer() {
            // 标签
            Text('Username:')
                .fontSize(14)
                .alignRules({
                    left: { anchor: "hGuideline", align: HorizontalAlign.End },
                    top: { anchor: "vGuideline1", align: VerticalAlign.Center }
                })
            // 输入框
            TextInput({placeholder: '请输入内容'})
                .width(150)
                 .alignRules({
                    left: { anchor: "hGuideline", align: HorizontalAlign.Start },
                    top: { anchor: "vGuideline1", align: VerticalAlign.Center }
                })
            // 辅助线(水平:距左80px,垂直:距顶40px)
        }
        .guideLine([
            { id: "hGuideline", direction: Axis.Vertical, position: { start: 80 } },
            { id: "vGuideline1", direction: Axis.Horizontal, position: { start: 40 } }
        ])
        .width('100%')
        .height(80)
        .padding(20)
    }
}

3.2 代码详解

3.2.1 RelativeContainer容器设置

RelativeContainer() {
    // 子组件
}
.guideLine([
    { id: "hGuideline", direction: Axis.Vertical, position: { start: 80 } },
    { id: "vGuideline1", direction: Axis.Horizontal, position: { start: 40 } }
])
.width('100%')
.height(80)
.padding(20)

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

属性

说明

guideLine

[...]

定义辅助线数组

width

'100%'

容器宽度为父容器的100%

height

80

容器高度为80vp

padding

20

容器内边距为20vp

这里的关键是guideLine属性,它定义了两条辅助线:

  1. 垂直辅助线(hGuideline)
  • id: "hGuideline" - 辅助线的唯一标识符
  • direction: Axis.Vertical - 方向为垂直
  • position: { start: 80 } - 位置在距离容器左侧80vp处
  1. 水平辅助线(vGuideline1)
  • id: "vGuideline1" - 辅助线的唯一标识符
  • direction: Axis.Horizontal - 方向为水平
  • position: { start: 40 } - 位置在距离容器顶部40vp处

这两条辅助线将作为表单元素定位的参考线。

3.2.2 标签文本设置

Text('Username:')
    .fontSize(14)
    .alignRules({
        left: { anchor: "hGuideline", align: HorizontalAlign.End },
        top: { anchor: "vGuideline1", align: VerticalAlign.Center }
    })

标签文本的关键属性设置:

属性

说明

fontSize

14

字体大小为14fp

alignRules.left

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

左侧对齐垂直辅助线的右侧

alignRules.top

{ anchor: "vGuideline1", align: VerticalAlign.Center }

顶部对齐水平辅助线的中心

这里的关键点是使用垂直辅助线(hGuideline)作为水平方向的锚点,并设置对齐方式为HorizontalAlign.End,使标签文本右对齐于辅助线。同时,使用水平辅助线(vGuideline1)作为垂直方向的锚点,并设置对齐方式为VerticalAlign.Center,使标签文本垂直居中于辅助线。

3.2.3 输入框设置

TextInput({placeholder: '请输入内容'})
    .width(150)
     .alignRules({
        left: { anchor: "hGuideline", align: HorizontalAlign.Start },
        top: { anchor: "vGuideline1", align: VerticalAlign.Center }
    })

输入框的关键属性设置:

属性

说明

width

150

输入框宽度为150vp

alignRules.left

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

左侧对齐垂直辅助线的左侧

alignRules.top

{ anchor: "vGuideline1", align: VerticalAlign.Center }

顶部对齐水平辅助线的中心

与标签文本类似,输入框也使用了相同的辅助线作为锚点,但水平对齐方式不同。通过设置对齐方式为HorizontalAlign.Start,使输入框左对齐于辅助线,从而实现标签在辅助线左侧,输入框在辅助线右侧的布局效果。

4. 辅助线的高级应用

4.1 辅助线位置的设置方式

辅助线的位置可以通过多种方式设置:

设置方式

示例

说明

固定数值

{ start: 80 }

距离容器边缘的固定距离(vp)

百分比

{ start: '30%' }

容器尺寸的百分比位置

居中

{ center: '50%' }

在容器中居中

结束位置

{ end: 20 }

距离容器结束边缘的距离

4.2 多条辅助线的组合应用

在复杂表单中,可以定义多条辅助线,形成网格系统:

.guideLine([
    // 垂直辅助线
    { id: "vGuide1", direction: Axis.Vertical, position: { start: '20%' } },
    { id: "vGuide2", direction: Axis.Vertical, position: { start: '50%' } },
    { id: "vGuide3", direction: Axis.Vertical, position: { start: '80%' } },
    // 水平辅助线
    { id: "hGuide1", direction: Axis.Horizontal, position: { start: 40 } },
    { id: "hGuide2", direction: Axis.Horizontal, position: { start: 80 } },
    { id: "hGuide3", direction: Axis.Horizontal, position: { start: 120 } }
])

4.3 辅助线与其他定位方式的结合

辅助线可以与其他定位方式结合使用,例如:

  • 组件之间的相对定位
  • 容器边缘定位
  • 屏障(Barrier)定位

5. 表单布局的最佳实践

5.1 标签与输入框对齐

使用辅助线可以实现以下几种常见的表单对齐方式:

对齐方式

实现方法

标签右对齐

标签使用HorizontalAlign.End,输入框使用HorizontalAlign.Start

标签左对齐

标签和输入框都使用HorizontalAlign.Start,输入框设置左边距

标签顶对齐

标签使用VerticalAlign.Top,输入框使用VerticalAlign.Top

标签居中对齐

标签和输入框都使用VerticalAlign.Center

5.2 多行表单项布局

对于多行表单,可以定义多条水平辅助线,每条对应一个表单项:

.guideLine([
    { id: "hGuideline", direction: Axis.Vertical, position: { start: 80 } },
    { id: "row1", direction: Axis.Horizontal, position: { start: 40 } },
    { id: "row2", direction: Axis.Horizontal, position: { start: 80 } },
    { id: "row3", direction: Axis.Horizontal, position: { start: 120 } }
])

6. 实际应用场景

辅助线定位在以下场景中特别有用:

  1. 登录/注册表单:创建对齐精确的输入字段
  2. 设置界面:对齐标签和控制元素
  3. 数据编辑表单:创建结构化的数据输入界面
  4. 复杂布局网格:创建基于网格的复杂布局

7. 总结

辅助线是RelativeContainer提供的强大功能,特别适合创建精确对齐的表单布局。

相关文章
|
编译器
鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(2/3)
本文介绍在三层架构中实现模块依赖的步骤。首先在产品定制层(features)的oh-package.json5文件中导入共享包依赖,如"basic":"file:../../commons/basic"。然后在产品层(products)的配置文件中同时导入公共能力层和产品定制层的依赖,示例展示了如何添加"basic"和"my"两个依赖项。通过这些配置,三层架构的各模块之间建立了完整的依赖关系。
85 0
鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(2/3)
|
9天前
|
缓存 移动开发 网络协议
纯血鸿蒙NEXT即时通讯/IM系统:RinbowTalk正式发布,全源码、纯ArkTS编写
RainbowTalk是一套基于MobileIMSDK的产品级鸿蒙NEXT端IM系统,目前已正式发布。纯ArkTS、从零编写,无套壳、没走捷径,每一行代码都够“纯”(详见:《RainbowTalk详细介绍》)。 MobileIMSDK是一整套开源IM即时通讯框架,历经10年,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp、鸿蒙NEXT,服务端基于Netty编写。
42 1
|
2天前
|
移动开发 前端开发 JavaScript
鸿蒙NEXT时代你所不知道的全平台跨端框架:CMP、Kuikly、Lynx、uni-app x等
本篇基于当前各大活跃的跨端框架的现状,对比当前它们的情况和未来的可能,帮助你在选择框架时更好理解它们的特点和差异。
37 0
|
2月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
86 15
|
2月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
87 11
|
1月前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
129 56
|
1月前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
150 55
|
2月前
|
存储 开发框架 API
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发二
本文详细介绍了基于声明式UI开发的健康饮食应用的设计与实现过程。内容涵盖从基础环境搭建到复杂功能实现的全流程,包括创建简单视图、构建布局(如Stack、Flex)、数据模型设计、列表与网格布局构建,以及页面跳转和数据传递等核心功能。 本文通过实际案例深入浅出地解析了声明式UI开发的关键技术和最佳实践,为开发者提供了宝贵的参考。
78 14
|
1月前
|
JavaScript 前端开发 开发者
09.HarmonyOS Next数据驱动UI开发:ForEach与动态渲染完全指南(上)
在现代前端开发中,数据驱动UI已成为主流开发范式。HarmonyOS Next的ArkTS语言和声明式UI框架完美支持这一理念,使开发者能够以更高效、更直观的方式构建复杂应用。
63 1
|
5月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
296 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex