36.[HarmonyOS NEXT Row案例四] 打造精美图标按钮:垂直对齐与视觉平衡的艺术

简介: 在移动应用界面设计中,带图标的操作按钮是一种常见且实用的UI元素,它结合了图标的直观性和文本的描述性,能够有效提升用户体验。本教程将详细讲解如何使用HarmonyOS NEXT的Row组件创建一个带图标的操作按钮,重点介绍垂直对齐与视觉平衡的实现技巧,帮助开发者打造出专业、美观的交互界面。


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

效果演示


1. 概述

在移动应用界面设计中,带图标的操作按钮是一种常见且实用的UI元素,它结合了图标的直观性和文本的描述性,能够有效提升用户体验。本教程将详细讲解如何使用HarmonyOS NEXT的Row组件创建一个带图标的操作按钮,重点介绍垂直对齐与视觉平衡的实现技巧,帮助开发者打造出专业、美观的交互界面。

2. 图标按钮的设计原则

在设计带图标的操作按钮时,需要考虑以下几个关键原则:

  1. 视觉平衡:图标与文本的大小、间距和位置需要保持适当的平衡,避免一方过于突出或压抑。
  2. 垂直对齐:图标与文本在垂直方向上需要对齐,通常是居中对齐,以保持整体的一致性和美观性。
  3. 适当间距:图标与文本之间需要保持适当的间距,既不过于拥挤,也不过于疏远。
  4. 一致性:在整个应用中,图标按钮的样式应保持一致,包括间距、对齐方式、颜色等。

3. 案例分析:带图标的操作按钮

本案例展示了如何创建一个带搜索图标的操作按钮,通过Row组件实现图标与文本的水平排列,并通过垂直对齐属性确保视觉平衡。

3.1 完整代码

@Component
export struct IconButtonExample {
    build() {
        Row({ space: 8  }) // 间距8vp,垂直居中
            {
            Image($r('app.media.02'))
                .width(20)
                .height(20)
            Text('搜索商品')
                .fontSize(14)
                .lineHeight(1.2)
        } .padding({ left: 16,right : 16, top: 12, bottom:12 })
        .backgroundColor(0xE0F5FF)
        .borderRadius(20)
        .alignItems(VerticalAlign.Center)
    }
}

3.2 代码详解

3.2.1 组件声明

@Component
export struct IconButtonExample {
    build() {
        // 组件内容
    }
}

这部分代码声明了一个名为IconButtonExample的自定义组件,使用@Component装饰器标记,并通过export关键字导出,使其可以在其他文件中被引用。

3.2.2 Row容器设置

Row({ space: 8  }) // 间距8vp,垂直居中
    {
    // 子组件
} .padding({ left: 16,right : 16, top: 12, bottom:12 })
.backgroundColor(0xE0F5FF)
.borderRadius(20)
.alignItems(VerticalAlign.Center)

这部分代码创建了一个Row容器,用于水平排列图标和文本。Row容器的属性设置如下:

属性

说明

space

8

子组件之间的间距为8vp

padding

{ left: 16, right: 16, top: 12, bottom: 12 }

设置内边距,使按钮内容不会过于贴近边缘

backgroundColor

0xE0F5FF

设置背景色为浅蓝色

borderRadius

20

设置边框圆角为20vp,使按钮呈现为胶囊形状

alignItems

VerticalAlign.Center

子组件在垂直方向上居中对齐

这些设置确保了按钮在视觉上的美观和一致性,同时提供了良好的点击区域。

3.2.3 图标组件

Image($r('app.media.02'))
    .width(20)
    .height(20)

这部分代码创建了一个图标组件,使用Image组件显示搜索图标。图标的属性设置如下:

属性

说明

资源

$r('app.media.02')

使用资源引用加载图标

width

20

图标宽度为20vp

height

20

图标高度为20vp

图标大小设置为20x20vp,这是一个常用的图标大小,既不会过大占用过多空间,也不会过小难以辨认。

3.2.4 文本组件

Text('搜索商品')
    .fontSize(14)
    .lineHeight(1.2)

这部分代码创建了一个文本组件,显示"搜索商品"文字。文本的属性设置如下:

属性

说明

fontSize

14

文字大小为14fp

lineHeight

1.2

行高为字体大小的1.2倍,提高可读性

文字大小设置为14fp,这是一个适中的大小,既不会过大占用过多空间,也不会过小难以阅读。行高设置为1.2倍,可以提高文本的可读性,同时保持紧凑的布局。

4. 垂直对齐与视觉平衡的实现技巧

4.1 垂直对齐的实现

在本案例中,垂直对齐主要通过Row容器的alignItems属性实现:

.alignItems(VerticalAlign.Center)

VerticalAlign.Center表示子组件在垂直方向上居中对齐,这确保了图标和文本在视觉上处于同一水平线上,提供了整齐、一致的外观。

HarmonyOS NEXT中,VerticalAlign枚举提供了三种垂直对齐方式:

说明

适用场景

Top

顶部对齐

当子组件高度不一致,需要从顶部开始排列时

Center

居中对齐

当需要子组件在垂直方向上居中,提供平衡的视觉效果时

Bottom

底部对齐

当子组件高度不一致,需要从底部开始排列时

在图标按钮中,通常使用Center对齐方式,以确保图标和文本在视觉上处于同一水平线上。

4.2 视觉平衡的实现

视觉平衡是指图标与文本在视觉上的协调与平衡,主要通过以下几个方面实现:

4.2.1 大小平衡

图标大小与文本大小需要保持适当的比例关系。在本案例中:

  • 图标大小:20x20vp
  • 文本大小:14fp

这种比例关系使图标略大于文本,但不会过于突出,保持了整体的视觉平衡。

4.2.2 间距平衡

图标与文本之间的间距需要适当,既不过于拥挤,也不过于疏远。在本案例中,通过Row容器的space属性设置间距为8vp,这是一个常用的间距值,提供了良好的视觉分隔。

Row({ space: 8 })

4.2.3 内边距平衡

按钮的内边距需要均衡,确保内容不会过于贴近边缘。在本案例中,通过padding属性设置内边距:

.padding({ left: 16, right: 16, top: 12, bottom: 12 })

左右内边距(16vp)略大于上下内边距(12vp),这是因为在水平方向上,文本需要更多的呼吸空间,而在垂直方向上,过大的内边距会使按钮过高,影响整体布局。

5. 常见图标按钮样式变体

基于本案例的基本结构,我们可以创建多种样式的图标按钮:

5.1 填充式图标按钮

填充式图标按钮具有完整的背景色,通常用于强调重要操作。

Row({ space: 8 }) {
    Image($r('app.media.02'))
        .width(20)
        .height(20)
    
    Text('搜索商品')
        .fontSize(14)
        .lineHeight(1.2)
}
.padding({ left: 16, right: 16, top: 12, bottom: 12 })
.backgroundColor(0x007DFF) // 深蓝色背景
.borderRadius(20)
.alignItems(VerticalAlign.Center)

5.2 描边式图标按钮

描边式图标按钮只有边框而没有背景色,通常用于次要操作。

Row({ space: 8 }) {
    Image($r('app.media.02'))
        .width(20)
        .height(20)
    
    Text('搜索商品')
        .fontSize(14)
        .lineHeight(1.2)
}
.padding({ left: 16, right: 16, top: 12, bottom: 12 })
.borderRadius(20)
.border({ width: 1, color: 0x007DFF }) // 添加边框
.alignItems(VerticalAlign.Center)

5.3 微型图标按钮

微型图标按钮尺寸较小,通常用于工具栏或紧凑布局。

Row({ space: 4 }) { // 减小间距
    Image($r('app.media.02'))
        .width(16) // 减小图标尺寸
        .height(16)
    
    Text('搜索')
        .fontSize(12) // 减小文字尺寸
        .lineHeight(1.2)
}
.padding({ left: 12, right: 12, top: 8, bottom: 8 }) // 减小内边距
.backgroundColor(0xE0F5FF)
.borderRadius(16) // 减小圆角
.alignItems(VerticalAlign.Center)

6. 图标按钮的交互优化

为了提升用户体验,可以为图标按钮添加交互效果:

6.1 点击反馈

通过添加onClick事件处理器,可以为按钮添加点击反馈:

Row({ space: 8 }) {
    // 图标和文本
}
.onClick(() => {
    // 处理点击事件
    console.info('搜索按钮被点击')
})

6.2 状态变化

可以通过状态变量控制按钮的外观,实现不同状态下的样式变化:

@Component
export struct IconButtonExample {
    @State isPressed: boolean = false
    
    build() {
        Row({ space: 8 }) {
            // 图标和文本
        }
        .backgroundColor(this.isPressed ? 0x007DFF : 0xE0F5FF) // 根据状态改变背景色
        .fontColor(this.isPressed ? 0xFFFFFF : 0x000000) // 根据状态改变文字颜色
        .onTouch((event) => {
            if (event.type === TouchType.Down) {
                this.isPressed = true
            } else if (event.type === TouchType.Up) {
                this.isPressed = false
            }
        })
    }
}

7. 图标按钮的组件化与复用

为了提高代码复用性,可以将图标按钮封装为一个独立的组件:

@Component
export struct IconButton {
    icon: Resource
    text: string
    backgroundColor?: Color = 0xE0F5FF
    onTap?: () => void
    
    build() {
        Row({ space: 8 }) {
            Image(this.icon)
                .width(20)
                .height(20)
            
            Text(this.text)
                .fontSize(14)
                .lineHeight(1.2)
        }
        .padding({ left: 16, right: 16, top: 12, bottom: 12 })
        .backgroundColor(this.backgroundColor)
        .borderRadius(20)
        .alignItems(VerticalAlign.Center)
        .onClick(() => {
            if (this.onTap) {
                this.onTap()
            }
        })
    }
}

然后在应用中使用这个组件:

@Entry
@Component
struct MyPage {
    build() {
        Column({ space: 16 }) {
            IconButton({
                icon: $r('app.media.search'),
                text: '搜索商品',
                onTap: () => console.info('搜索按钮被点击')
            })
            
            IconButton({
                icon: $r('app.media.filter'),
                text: '筛选',
                backgroundColor: 0xF0F0F0,
                onTap: () => console.info('筛选按钮被点击')
            })
        }
        .width('100%')
        .padding(16)
    }
}

8. 总结

本教程详细讲解了如何使用HarmonyOS NEXT的Row组件创建带图标的操作按钮,重点介绍了垂直对齐与视觉平衡的实现技巧。通过本案例,我们学习了:

  1. 图标按钮的设计原则
  2. Row组件的基本用法和参数设置
  3. 垂直对齐的实现方法
  4. 视觉平衡的关键要素
  5. 常见图标按钮样式变体
  6. 图标按钮的交互优化
  7. 图标按钮的组件化与复用

掌握这些知识点后,你可以设计出美观、易用、一致的图标按钮,提升应用的用户体验。在实际开发中,可以根据具体需求调整图标大小、文本样式、间距和颜色,创建符合应用设计风格的图标按钮。

相关文章
|
10天前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
59 0
|
10天前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
87 0
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
10天前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
38 0
|
10天前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
98 0
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
3月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:外卖App
仓颉语言实战分享,教你如何用仓颉开发外卖App界面。内容包括页面布局、导航栏自定义、搜索框实现、列表模块构建等,附完整代码示例。轻松掌握Scroll、List等组件使用技巧,提升HarmonyOS应用开发能力。
|
2月前
|
安全 JavaScript API
鸿蒙开发核心要素
鸿蒙开发核心要素
|
3月前
|
存储 IDE 定位技术
【HarmonyOS 5】鸿蒙组件&模板服务详解 - 助力高效开发的利器
在移动应用开发领域,效率与质量始终是开发者追求的核心目标。鸿蒙系统作为新兴的操作系统,为开发者提供了丰富且强大的开发资源,其中鸿蒙组件&模板服务更是成为开发者快速构建高质量应用的得力助手。
133 0
HarmonyOS NEXT仓颉开发语言实战案例:电影App
周末好!本文分享使用仓颉语言重构ArkTS实现的电影App案例,对比两者在UI布局、组件写法及语法差异。内容包括页面结构、列表分组、分类切换与电影展示等。通过代码演示仓颉在HarmonyOS开发中的应用。##仓颉##ArkTS##HarmonyOS开发
|
3月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:健身App
本期分享一个健身App首页的布局实现,顶部采用Stack容器实现重叠背景与偏移效果,列表部分使用List结合Scroll实现可滚动内容。代码结构清晰,适合学习HarmonyOS布局技巧。
HarmonyOS NEXT仓颉开发语言实战案例:小而美的旅行App
本文分享了一个旅行App首页的设计与实现,使用List容器搭配Row、Column布局完成个人信息、功能列表及推荐模块的排版,详细展示了HarmonyOS下的界面构建技巧。