前言
快递信息时间轴在购物软件中是必不可少的功能,通过时间轴可以展示快递从发货到派送的每一个环节。本篇文章通过代码的形式详细讲解在鸿蒙日常开发中如何实现时间轴的效果。(篇尾附有完整源码)
实现效果
先看最终实现的效果,下面通过代码讲解怎么一步步实现时间轴。
需求分析
- 快递信息时间轴整体包括三个状态:开始状态,当前状态,未达状态。
- 不同状态对应标题颜色及图标不同。
- 字体颜色可根据状态的不同改变。
- 提示文字可以根据具体情况是否显示
- 时间轴上的虚线可以根据当前节点布局的高度动态改变。(重点)
根据具体需求,采用 List 组件实现时间轴,然后通过控制不同 item 的状态来实现效果。
技术实现
- 定义节点数据对象,这里使用不同数字代表当前节点的状态:1 表示开始,2 表示当前,3 表示即将到达。
export class OrderDetailBean{
nodeStatus?: number //当前节点状态
nodeName?: string //节点名称
nodeNote?: string //节点备注
nodeTime?: string //节点时间
}
- 构建节点集合。
aboutToAppear(): void {
let order1 = new OrderDetailBean()
order1.nodeStatus = 1
order1.nodeName = "唐僧已经从长安出发"
order1.nodeTime = "1900-7-25 14:30:03"
order1.nodeNote = ""
let order2 = new OrderDetailBean()
order2.nodeStatus = 1
order2.nodeName = "唐僧到达五指山"
order2.nodeNote = "温馨提示:此处有妖猴出没"
let order3 = new OrderDetailBean()
order3.nodeStatus = 1
order3.nodeName = "孙悟空护送唐僧西天取经"
order3.nodeNote = "请小白龙提前准备,下一站化身白龙马。"
let order4 = new OrderDetailBean()
order4.nodeStatus = 2
order4.nodeName = "唐僧到达高老庄"
order3.nodeNote = "孙悟空大战猪八戒"
let order5 = new OrderDetailBean()
order5.nodeStatus = 3
order5.nodeName = "唐僧即将到达流沙河"
order5.nodeNote = "收服卷帘大将沙悟净。"
let order6 = new OrderDetailBean()
order6.nodeStatus = 3
order6.nodeName = "唐僧即将到达大雷音"
order6.nodeNote = "取得真经,修成正果。"
this.list.push(order1, order2, order3, order4, order5,order6)
}
- 使用 List 组件实现时间轴,鸿蒙的 List 组件原生支持横向和纵向布局,可以根据实际需求进行调整。这里使用默认纵向布局。
List(){
ForEach(this.list,(item: object, index: number) = > {
this.itemView(this.list[index], index)
})
}.width("100%")
.height("100%")
- 接下来就是绘制 List 的 item,从最终的效果图来看,虚线部分只会在首尾之间显示,这里通过集合长度判断。最后一条虚线不显示,虚线可以通过设置布局边框的不同样式实现,这里使用的BorderStyle.Dashe。
// 时间轴
if (this.index < this.totalSize - 1) {
Stack()
.width(0)
.borderStyle(BorderStyle.Dashed)
.borderWidth(0.8)
.height(this.minHeight)
.borderColor($r('app.color.color_gray'))
}
- 同时虚线部分应该有最小高度,然后通过当前 Item 的高度变化动态改变虚线的高度,鸿蒙布局组件提供了 onAreaChange 方法用来监听当前布局高度的变化,通过修改最新高度来实现虚线的动态变化。注意这个 minHeight 必须使用@state修饰。
.onAreaChange((oldValue: Area, newValue: Area) = > {
this.minHeight = newValue.height as number
})
- 最后使用 Row 布局将虚线布局和内容布局横向排列,就可以实现虚线跟随内容高度变化。
完整源码
@Component
struct ItemLayout {
@State bean: OrderDetailProgressBean = new OrderDetailProgressBean()
index: number = 0
totalSize: number = 0
@State minHeight: number = 54
build() {
Row() {
Column() {
// 时间轴节点
Image(this.getImage(this.bean.nodeStatus ?? 0))
.width(16)
.height(16)
.borderRadius(8)
// 时间轴
if (this.index < this.totalSize - 1) {
Stack()
.width(0)
.borderStyle(BorderStyle.Dashed)
.borderWidth(0.8)
.height(this.minHeight)
.borderColor("#BABEC4")
}
}
// 内容区域
Column() {
Text(this.bean.nodeName)
.fontSize(14)
.fontColor(this.getColor(this.bean.nodeStatus ?? 0))
.fontWeight(FontWeight.Medium)
Text(this.bean.nodeTime)
.fontSize(12)
.fontColor(Color.Gray)
.margin({
top: 4,
})
Text(this.bean.nodeNote)
.fontSize(12)
.fontColor(this.bean.nodeStatus == 1 ? Color.Gray : Color.Orange)
.margin({
top: 8,
})
}
.margin({
left: 8,
})
.alignItems(HorizontalAlign.Start)
.width("84%")
.margin({
left: 8,
})
.onAreaChange((oldValue: Area, newValue: Area) = > {
this.minHeight = newValue.height as number
})
}
.alignItems(VerticalAlign.Top)
.width("100%")
}
getImage(state: number) {
if (state == 1) {
return $r("app.media.icon_complete")
} else if (state == 2) {
return $r("app.media.icon_selecte")
} else {
return $r("app.media.icon_unselecte")
}
}
getColor(state: number) {
if (state == 1) {
return $r("app.color.color_gray")
} else if (state == 2) {
return $r("app.color.color_black")
} else {
return $r("app.color.color_gray_1")
}
}
}
总结
本文的重点是知道虚线可以根据设置布局样式实现,然后就是如何实现虚线和布局动态高度变化同步,通过鸿蒙原生组件提供的方法可以实现。
审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
HarmonyOS
+关注
关注
80文章
2130浏览量
33434
发布评论请先 登录
相关推荐
热点推荐
【HarmonyOS next】ArkUI-X休闲益智猜字谜【基础】
下图是在iOS中的运行效果
下图是在HarmonyOS中的运行效果
今天咱们来聊聊如何用ArkUI-X这个新兴框架实现跨端开发,通过一个猜字谜小游戏带大家感受它的开发魅力。本文不仅能让
发表于 06-26 20:01
HarmonyOS实战:Tab顶部滑动悬停功能实现
日常开发过程中,遇到这种 Scroll 嵌套 List 列表滑动顶部悬停的场景十分常见,在鸿蒙开发时也正好实现了这个功能,本篇文章将带你一步步实现 Tab 顶部悬停的效果,建议点赞收藏!
HarmonyOS实战: 城市选择功能的快速实现
最近在日常开发过程中,需要实现城市选择功能,同时支持模糊搜索。看似简单的功能动手实现起来却有很多难点。本篇文章详细记录开发过程中遇到的问题和对应的解决方法,希望能够帮助你,建议点赞收藏!
HarmonyOS实战:3秒实现一个自定义轮播图
那么简单,需要考虑的细节很多。不过在 HarmonyOS 中实现一个轮播图却是十分的简单,本篇文章教你在最短的时间内快速实现一个自定义的 轮播图,建议点赞收藏!
HarmonyOS实战:自定义时间选择器
前言 最近在日常鸿蒙开发过程中,经常会使用一些时间选择器,鸿蒙官方提供的时间选择器满足不了需求,所以自己动手自定义一些经常会使用到的时间选择器,希望能帮到你,建议点赞收藏! 实现

HarmonyOS实战:组件化项目搭建
?本文将详细讲解HarmonyOs组件化项目搭建的全过程,带领大家实现一个组件化项目。 项目创建 首先创建一个项目工程,点击开发工具DevEco-Stdio的****File 选项,选择 New 然后点击 Create Project 。 选择创建一个EmptyAbili

HarmonyOS5云服务技术分享--ArkTS调用函数
?【HarmonyOS实战指南】手把手教你用ArkTS玩转云函数文件获取?
大家好呀今天我们来聊聊如何通过HarmonyOS的ArkTS语言实现云函数文件获取功能。整个过程就像搭积木一
发表于 05-22 18:22
HarmonyOS NEXT开发实战:DevEco AI辅助编程工具(CodeGenie)的使用
如下:
此接口默认插入到方法开头,可根据当前工程onWindowStageCreate逻辑来将此接口移动至合适的位置,保证页面能正常跳转。四、效果实现
发表于 03-10 15:41
HarmonyOS NEXT开发实战:DevEco Studio中DeepSeek的使用
DeepSeek API参考,以及请求体详情信息可见:DeepSeek API文档
第五步:体验DeepSeek辅助编程
选择模型:点击左侧边栏的ProxyAI,打开对话框,输入想要的效果内容
案例实现实现
发表于 03-07 14:56
HarmonyOS NEXT 原生应用/元服务-性能分析基础耗时分析Time分析
在录制前单击
指定要录制的泳道:
User Trace:用户自定义打点泳道,基于时间轴展示当前时段内用户使用hiTraceMeter接口自定义的打点任务的具体运行情况。
ArkTS
发表于 02-25 14:31
HarmonyOS NEXT 原生应用/元服务-DevEco Profiler整体界面布局及概念
的可视化呈现。包含工具控制栏、时间轴、泳道区域、详情区域,通过不同泳道展示,直观展示调优详情。
本文主要参考与引用自HarmonyOS官方文档。
发表于 02-17 14:55
名单公布!【书籍评测活动NO.56】极速探索HarmonyOS NEXT:纯血鸿蒙应用开发实践
本书深入剖析了HarmonyOS NEXT的各项技术,通过丰富的实战案例,由浅入深地解析了HarmonyOS NEXT的原理与应用。借助多样化的实战案例和丰富的配套资源,读者可以全面
发表于 01-20 16:53
【「时间序列与机器学习」阅读体验】时间序列的信息提取
本章主讲时间序列的信息提取,章节中有许多概念定义和数学公式,并配有Python代码演示,细细品读与理解动手演练,还是很开拓思维视野的。下面以笔记形式进行展开。
时间序列的信息提取是
发表于 08-17 21:12
【《时间序列与机器学习》阅读体验】+ 时间序列的信息提取
之前对《时间序列与机器学习》一书进行了整体浏览,并且非常轻松愉快的完成了第一章的学习,今天开始学习第二章“时间序列的信息提取”。
先粗略的翻阅第二章,内容复杂,充斥了大量的定义、推导计算、代码,好在
发表于 08-14 18:00
评论