前言
快遞信息時間軸在購物軟件中是必不可少的功能,通過時間軸可以展示快遞從發貨到派送的每一個環節。本篇文章通過代碼的形式詳細講解在鴻蒙日常開發中如何實現時間軸的效果。(篇尾附有完整源碼)
實現效果
先看最終實現的效果,下面通過代碼講解怎么一步步實現時間軸。
需求分析
- 快遞信息時間軸整體包括三個狀態:開始狀態,當前狀態,未達狀態。
- 不同狀態對應標題顏色及圖標不同。
- 字體顏色可根據狀態的不同改變。
- 提示文字可以根據具體情況是否顯示
- 時間軸上的虛線可以根據當前節點布局的高度動態改變。(重點)
根據具體需求,采用 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
+關注
關注
79文章
2054瀏覽量
32167
發布評論請先 登錄
相關推薦
熱點推薦
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
HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)習慣推薦方案概述
應用/元服務與HarmonyOS交互。
當用戶使用應用/元服務播放歌單時,應用/元服務可以向Intents Kit共享該意圖,并提供一些用于學習的特征,例如播放開始/結束時間、播放時長、歌單名等
發表于 11-19 17:59
AWTK 最新動態:支持鴻蒙系統(HarmonyOS Next)
導讀HarmonyOS是全球第三大移動操作系統,有巨大的市場潛力,在國產替代的背景下,機會多多,AWTK支持HarmonyOS,讓AWTK開發者也能享受HarmonyOS生態的紅利。AWTK全稱

【「時間序列與機器學習」閱讀體驗】時間序列的信息提取
本章主講時間序列的信息提取,章節中有許多概念定義和數學公式,并配有Python代碼演示,細細品讀與理解動手演練,還是很開拓思維視野的。下面以筆記形式進行展開。
時間序列的信息提取是
發表于 08-17 21:12
【《時間序列與機器學習》閱讀體驗】+ 時間序列的信息提取
之前對《時間序列與機器學習》一書進行了整體瀏覽,并且非常輕松愉快的完成了第一章的學習,今天開始學習第二章“時間序列的信息提取”。
先粗略的翻閱第二章,內容復雜,充斥了大量的定義、推導計算、代碼,好在
發表于 08-14 18:00
慶科信息獲HarmonyOS高級應用開發能力認證!助力品牌快速打造鴻蒙原生應用
近日,上海慶科信息技術有限公司榮獲HarmonyOS應用開發者高級認證,公司在華為鴻蒙生態的開發能力得到進一步拓展,能夠幫助客戶快速開發基于HarmonyOS Next的鴻蒙原生應用,助力廠商全面擁抱鴻蒙生態。

海康威視助力快遞行業場景數字化
? 目前,海康威視相關技術方案已在快遞打包、分揀、裝載運輸、終端配送、退換貨等多個環節開展場景數字化建設,助力企業提升運營管理效率,也給大家帶來更好的體驗。 快速識別面單信息,快遞包裹“不掉
評論