03 HarmonyOS Next儀表盤案例詳解(二):進階篇

溫馨提示:本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦!

文章目錄

    • 前言
    • 1. 響應式設計
      • 1.1 屏幕適配
      • 1.2 彈性布局
    • 2. 數據展示與交互
      • 2.1 數據卡片渲染
      • 2.2 圖表區域
    • 3. 事件處理機制
      • 3.1 點擊事件處理
      • 3.2 手勢交互
    • 4. 性能優化技巧
      • 4.1 懶加載與按需渲染
      • 4.2 狀態管理優化
    • 5. 數據流管理
      • 5.1 單向數據流
      • 5.2 響應式數據綁定
    • 6. 最佳實踐
      • 6.1 組件化開發
      • 6.2 樣式與邏輯分離
    • 7. 總結

前言

關于HarmonyOS NEXT 的儀表盤 從

    1. HarmonyOS應用開發實踐與技術解析
    1. HarmonyOS Next儀表盤案例詳解(一):基礎篇
      再到本章節 就已經全部講完了, 接下來我們先展示一下其運行的效果

首頁List

效果演示

1. 響應式設計

1.1 屏幕適配

// 獲取屏幕寬度
this.screenWidth = px2vp(AppStorage.Get<number>('windowWidth') || 720)// 根據屏幕寬度決定每行顯示的卡片數量
Flex({ wrap: FlexWrap.Wrap, justifyContent: this.screenWidth > 600 ? FlexAlign.Start : FlexAlign.SpaceAround })// 卡片寬度自適應
.width(this.screenWidth > 600 ? '22%' : '45%')

案例中通過檢測屏幕寬度實現響應式布局:

  • 當屏幕寬度大于600像素時,每行顯示4個卡片,寬度為22%
  • 當屏幕寬度小于等于600像素時,每行顯示2個卡片,寬度為45%

這種響應式設計使應用能夠在不同尺寸的設備上提供良好的用戶體驗。

1.2 彈性布局

Flex({ wrap: FlexWrap.Wrap, justifyContent: this.screenWidth > 600 ? FlexAlign.Start : FlexAlign.SpaceAround })

使用Flex組件的wrap屬性實現卡片的自動換行,并根據屏幕寬度動態調整對齊方式:

  • 寬屏設備:左對齊(FlexAlign.Start)
  • 窄屏設備:均勻分布(FlexAlign.SpaceAround)

2. 數據展示與交互

2.1 數據卡片渲染

ForEach(this.dataCards, (card: DashboardCardItem) => {// 數據卡片Column() {// 卡片標題Text(card.title).fontSize(14).fontColor('#666').margin({bottom: 12})// 數據值和單位Flex({alignItems: ItemAlign.Baseline}) {Text(card.value).fontSize(28).fontWeight(FontWeight.Bold).fontColor(card.color)Text(card.unit).fontSize(14).fontColor(card.color).margin({left: 4})}.margin({bottom: 8})// 趨勢指標Text(card.trend).fontSize(14).fontColor(card.trend.includes('+') ? '#2A9D8F' : '#E76F51')}// 卡片樣式...
})

使用ForEach循環渲染數據卡片,每個卡片包含標題、數值、單位和趨勢指標。根據趨勢的正負動態設置顏色:

  • 正向趨勢(+):綠色(#2A9D8F)
  • 負向趨勢(-):紅色(#E76F51)

2.2 圖表區域

// 圖表區域(示意)
Column() {Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {Text('銷售趨勢分析').fontSize(18).fontWeight(FontWeight.Medium)Flex() {ForEach(['日', '周', '月', '年'], (item: string) => {Text(item).fontSize(14).fontColor(item === '周' ? '#007DFF' : '#666').backgroundColor(item === '周' ? '#E6F1FF' : 'transparent').height(32).width(40).textAlign(TextAlign.Center).borderRadius(16)})}}// ...// 圖表占位區域Column() {Text('此處放置銷售趨勢圖表').fontSize(14).fontColor('#999')}// ...
}

圖表區域包含標題欄和時間篩選器,通過ForEach循環渲染日、周、月、年四個選項,并高亮顯示當前選中的"周"選項。這種設計允許用戶快速切換不同時間維度的數據視圖。

3. 事件處理機制

3.1 點擊事件處理

ForEach(['日', '周', '月', '年'], (item: string) => {Text(item).fontSize(14).fontColor(item === this.timeRange ? '#007DFF' : '#666').backgroundColor(item === this.timeRange ? '#E6F1FF' : 'transparent').height(32).width(40).textAlign(TextAlign.Center).borderRadius(16).onClick(() => {// 更新選中的時間范圍this.timeRange = item// 根據新的時間范圍更新圖表數據this.updateChartData()})
})

通過onClick事件處理器實現交互功能,當用戶點擊不同的時間選項時:

  1. 更新當前選中的時間范圍狀態變量
  2. 調用更新圖表數據的方法,刷新圖表顯示

3.2 手勢交互

// 圖表區域手勢交互
GestureGroup({// 同時識別多種手勢type: GestureType.Parallel,// 手勢之間的關系gestures: [PanGesture({ direction: PanDirection.Horizontal }).onActionStart((event: GestureEvent) => {// 記錄起始位置this.startX = event.offsetX}).onActionUpdate((event: GestureEvent) => {// 計算拖動距離,更新圖表顯示范圍let offsetX = event.offsetX - this.startXthis.updateChartViewport(offsetX)}),PinchGesture().onActionUpdate((event: GestureEvent) => {// 根據縮放比例調整圖表顯示范圍this.updateChartScale(event.scale)})]
})

實現了兩種手勢交互:

  • 平移手勢(PanGesture):允許用戶左右滑動查看不同時間段的數據
  • 捏合手勢(PinchGesture):允許用戶通過捏合操作放大或縮小圖表視圖

4. 性能優化技巧

4.1 懶加載與按需渲染

LazyForEach(this.dataSource, (item: DataItem) => {// 數據項渲染邏輯DataItemComponent({ data: item })
})

使用LazyForEach代替ForEach進行大量數據的渲染,實現按需加載,提高應用性能:

  • 只渲染可見區域的數據項
  • 當用戶滾動時,動態加載新的數據項
  • 釋放不可見區域的資源

4.2 狀態管理優化

// 使用AppStorage全局狀態管理
aboutToAppear() {// 訂閱全局狀態變化this.dashboardDataSubscriber = AppStorage.Subscribe('dashboardData', (data: DashboardData) => {// 僅在數據變化時更新UIif (JSON.stringify(data) !== JSON.stringify(this.localData)) {this.localData = datathis.updateUI()}})
}aboutToDisappear() {// 取消訂閱,避免內存泄漏this.dashboardDataSubscriber.unsubscribe()
}

通過狀態管理優化提高應用性能:

  • 使用AppStorage進行全局狀態管理
  • 實現數據變化的細粒度檢測,避免不必要的UI更新
  • 組件銷毀時取消訂閱,防止內存泄漏

5. 數據流管理

5.1 單向數據流

// 父組件
@State dashboardData: DashboardData = initialDatabuild() {Column() {// 將數據通過屬性傳遞給子組件DataCards({ data: this.dashboardData.cards })ChartSection({ data: this.dashboardData.chartData,// 傳遞回調函數處理子組件事件onTimeRangeChange: (range) => this.updateTimeRange(range)})}
}// 子組件
@Component
struct DataCards {// 使用@Prop接收父組件傳遞的數據@Prop data: CardData[]build() {// 渲染邏輯}
}

實現單向數據流模式:

  • 父組件維護應用狀態
  • 通過屬性將數據傳遞給子組件
  • 子組件通過回調函數將事件傳遞給父組件
  • 父組件處理事件并更新狀態,觸發UI更新

5.2 響應式數據綁定

// 定義響應式狀態
@State selectedTimeRange: string = '周'
@State chartData: ChartDataPoint[] = []// 計算屬性
@Computed get filteredData(): ChartDataPoint[] {return this.chartData.filter(item => {// 根據選中的時間范圍過濾數據if (this.selectedTimeRange === '日') {return item.date.startsWith(this.currentDay)} else if (this.selectedTimeRange === '周') {return this.isInCurrentWeek(item.date)}// 其他條件...})
}build() {Column() {// 使用計算屬性自動更新UIChartComponent({ data: this.filteredData })}
}

利用ArkTS的響應式特性:

  • 使用@State聲明響應式狀態
  • 使用@Computed定義計算屬性,自動響應狀態變化
  • 狀態變化時自動觸發UI更新,無需手動干預

6. 最佳實踐

6.1 組件化開發

// 抽取數據卡片為獨立組件
@Component
struct DataCard {@Prop cardData: DashboardCardItembuild() {Column() {Text(this.cardData.title).fontSize(14).fontColor('#666').margin({bottom: 12})Flex({alignItems: ItemAlign.Baseline}) {Text(this.cardData.value).fontSize(28).fontWeight(FontWeight.Bold).fontColor(this.cardData.color)Text(this.cardData.unit).fontSize(14).fontColor(this.cardData.color).margin({left: 4})}.margin({bottom: 8})Text(this.cardData.trend).fontSize(14).fontColor(this.cardData.trend.includes('+') ? '#2A9D8F' : '#E76F51')}.width('100%').padding(16).backgroundColor('#FFFFFF').borderRadius(12)}
}// 在主組件中使用
ForEach(this.dataCards, (card: DashboardCardItem) => {DataCard({ cardData: card })
})

組件化開發的優勢:

  • 提高代碼復用率
  • 簡化主組件邏輯
  • 便于維護和測試
  • 支持團隊協作開發

6.2 樣式與邏輯分離

// 樣式常量
const CARD_STYLES = {container: {width: '100%',padding: 16,borderRadius: 12,backgroundColor: '#FFFFFF'},title: {fontSize: 14,fontColor: '#666',marginBottom: 12},// 其他樣式...
}// 在組件中使用
@Component
struct StyledCard {@Prop data: CardDatabuild() {Column() {Text(this.data.title).fontSize(CARD_STYLES.title.fontSize).fontColor(CARD_STYLES.title.fontColor).margin({bottom: CARD_STYLES.title.marginBottom})// 其他UI元素...}.width(CARD_STYLES.container.width).padding(CARD_STYLES.container.padding).backgroundColor(CARD_STYLES.container.backgroundColor).borderRadius(CARD_STYLES.container.borderRadius)}
}

樣式與邏輯分離的好處:

  • 提高代碼可讀性
  • 便于統一管理和修改樣式
  • 支持主題切換
  • 減少重復代碼

7. 總結

本文詳細介紹了HarmonyOS儀表盤應用的進階開發技巧,包括:

  1. 響應式設計:通過屏幕適配和彈性布局實現多設備適配
  2. 數據展示與交互:實現數據卡片渲染和圖表區域的交互功能
  3. 事件處理機制:通過點擊事件和手勢交互增強用戶體驗
  4. 性能優化技巧:使用懶加載和狀態管理優化提高應用性能
  5. 數據流管理:實現單向數據流和響應式數據綁定
  6. 最佳實踐:采用組件化開發和樣式與邏輯分離的開發模式

通過這些技巧,開發者可以構建出高性能、易維護且用戶體驗良好的HarmonyOS儀表盤應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72680.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72680.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72680.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python-leetcode-統計構造好字符串的方案數

2466. 統計構造好字符串的方案數 - 力扣&#xff08;LeetCode&#xff09; 這個問題可以用**動態規劃&#xff08;DP&#xff09;**來解決&#xff0c;思路如下&#xff1a; 思路 1. 定義 DP 數組 設 dp[i] 表示長度為 i 的好字符串的個數。 2. 狀態轉移方程 我們可以在 dp…

MySQL------存儲引擎和用戶和授權

9.存儲引擎 1.兩種引擎 MyISAM和InnoDB 2.兩種區別 1.事務&#xff1a; MyISAM不支持事務 2.存儲文件: innodb : frm、ibd MyISAM: frm、MYD、MYI 3.數據行鎖定: MyISAM不支持 4.全文索引: INNODB不支持&#xff0c;所以MYISAM做select操作速度很快 5.外鍵約束: MyISAM…

題海拾貝:P9241 [藍橋杯 2023 省 B] 飛機降落

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《題海拾貝》 歡迎點贊&#xff0c;關注&#xff01; 1、題…

刪除有序數組中的重復項(js實現,LeetCode:26)

給你一個 非嚴格遞增排列 的數組 nums &#xff0c;請你原地刪除重復出現的元素&#xff0c;使每個元素只出現一次&#xff0c;返回刪除后數組的新長度。元素的相對順序應該保持一致。然后返回 nums 中唯一元素的個數。 考慮 nums 的唯一元素的數量為 k &#xff0c;你需要做以…

3-9 WPS JS宏單元格復制、重定位應用(拆分單表到多表)

************************************************************************************************************** 點擊進入 -我要自學網-國內領先的專業視頻教程學習網站 *******************************************************************************************…

大白話react第十六章React 與 WebGL 結合的實戰項目

大白話react第十六章React 與 WebGL 結合的實戰項目 1. 項目簡介 React 是一個構建用戶界面的強大庫&#xff0c;而 WebGL 則允許我們在網頁上實現高性能的 3D 圖形渲染。將它們結合起來&#xff0c;我們可以創建出炫酷的 3D 網頁應用&#xff0c;比如 3D 產品展示、虛擬場景…

【AI賦能】AI 工具生成視頻教材:從創意到成品的全流程指南

AI 工具生成視頻教材&#xff1a;從創意到成品的全流程指南 目標 通過本教材&#xff0c;您將學會如何利用 AI 工具&#xff08;Grok、Sora、Speechify 和 CapCut&#xff09;生成一個完整的視頻&#xff0c;包括腳本生成、視頻片段制作、字幕添加、音頻生成以及最終剪輯合成…

C/C++藍橋杯算法真題打卡(Day2)

一、面試題 08.01. 三步問題 - 力扣&#xff08;LeetCode&#xff09; 算法代碼&#xff1a; class Solution { public:const int MOD 1e9 7;int waysToStep(int n) {// 1. 創建 dp 表// 2. 初始化// 3. 填表// 4. 返回// 處理邊界情況if (n 1 || n 2)return n;if (n 3)r…

騰訊云物聯網平臺(IoT Explorer)設備端使用

1、直接看圖流程 2、跑起來demo,修改產品id,設備名稱,設備秘鑰。 3、連接部分 4、修改默認地址和端口 sdk里面的地址默認是帶著產品ID拼接的,咱們現在中鐵沒有泛域名解析,要改下這里。把+productID都去掉,然后地址里的.也去掉。

GStreamer —— 2.13、Windows下Qt加載GStreamer庫后運行 - “教程13:播放控制“(附:完整源碼)

運行效果(音頻) 簡介 上一個教程演示了GStreamer工具。本教程介紹視頻播放控制。快進、反向播放和慢動作都是技術 統稱為 Trick Modes&#xff0c;它們都有一個共同點 修改 Normal playback rate。本教程介紹如何實現 這些效果并在交易中添加了幀步進。特別是&#xff0c;它 顯…

Dify+DeepSeek | Excel數據一鍵可視化(創建步驟案例)(echarts助手.yml)(文檔表格轉圖表、根據表格繪制圖表、Excel繪制圖表)

Dify部署參考&#xff1a;Dify Rag部署并集成在線Deepseek教程&#xff08;Windows、部署Rag、安裝Ragan安裝、安裝Dify安裝、安裝ollama安裝&#xff09; DifyDeepSeek - Excel數據一鍵可視化&#xff08;創建步驟案例&#xff09;-DSL工程文件&#xff08;可直接導入&#x…

vscode mac版本 配置git

首先使用 type -a git查看git的安裝目錄 然后在vscode中找到settings配置文件&#xff0c;修改git.path

JVM與性能調優詳解

以下是關于 JVM與性能調優 的詳細解析&#xff0c;結合理論、實踐及常見問題&#xff0c;分多個維度展開&#xff1a; 一、JVM性能調優的核心目標 性能調優的核心目標是通過優化內存管理、垃圾回收&#xff08;GC&#xff09;策略和線程管理&#xff0c;實現以下平衡&#xff…

Vue23Web 基礎性拉滿的面試題(2025版)還沒更新完...

Vue2&3 基礎性1. 關於Vue2和Vue3生命週期的差別2. Vue2&3組件之間傳參不同點Vue2 傳遞與接收Vue3 傳遞與接收 (使用script setup語法糖)Vue3 傳遞與接收 (不使用script setup語法糖) 3. Vue2&3 keep-alive 組件Vue2 keep-aliveVue3 keep-alive 進階性爲什麼POST請求…

基于SpringBoot實現旅游酒店平臺功能一

一、前言介紹&#xff1a; 1.1 項目摘要 隨著社會的快速發展和人民生活水平的不斷提高&#xff0c;旅游已經成為人們休閑娛樂的重要方式之一。人們越來越注重生活的品質和精神文化的追求&#xff0c;旅游需求呈現出爆發式增長。這種增長不僅體現在旅游人數的增加上&#xff0…

【程序自動分析——并查集,離散化】

題目 代碼&#xff08;注意不是把p修改為unordered_map&#xff0c;而是增加一個get&#xff09; #include <bits/stdc.h> using namespace std;const int N 2e510; //n個數據&#xff0c;可能引入2*n個離散點int p[N]; bool cannot; unordered_map<int, int> mp…

審批流AntV框架螞蟻數據可視化X6餅圖(附注釋)

大家好&#xff0c;這次使用的是AntV的螞蟻數據可視化X6框架&#xff0c;類似于審批流的場景等&#xff0c;代碼如下&#xff1a; X6框架參考網址&#xff1a;https://x6.antv.vision/zh/examples/showcase/practices#bpmn 可以進入該網址&#xff0c;直接復制下方代碼進行調試…

linux取代ls的命令行工具:eza

官方倉庫 https://github.com/eza-community/eza 安裝 cargo install eza驗證 eza --version用法 替換ls 別名 安裝文檔 官方提供的安裝文檔是這個 https://github.com/eza-community/eza/blob/main/INSTALL.md 可以通過cargo命令安裝&#xff0c;debian還可以通過apt安裝…

【DeepSeek】Ubuntu快速部署DeepSeek(Ollama方式)

文章目錄 人人都該學習的DeepSeekDeepSeek不同版本功能差異DeepSeek與硬件直接的關系DeepSeek系統兼容性部署方式選擇部署步驟&#xff08;Ollama方式&#xff09;1.選定適合的deepseek版本2.環境準備3.安裝Ollama4.部署deepseek5.測試使用 人人都該學習的DeepSeek DeepSeek 作…

redis熱key

在 Redis 中&#xff0c;熱 Key&#xff08;Hot Key&#xff09; 是指被頻繁訪問的 Key&#xff0c;可能會導致以下問題&#xff1a; 性能瓶頸&#xff1a;單個 Redis 實例的 CPU 或網絡帶寬被耗盡。 數據傾斜&#xff1a;在 Redis 集群中&#xff0c;熱 Key 可能導致某個節點…