【鴻蒙HarmonyOS Next App實戰開發】??ArkUI時鐘界面實現解析:動態雙模式時鐘與沉浸式體驗?

在鴻蒙next系統上,通過ArkTS寫了個時鐘顯示頁面,集成在【圖影工具箱】應用中,應用商店可以下載使用。

這個頁面實現起來比較簡單,就是左邊一個模擬時鐘,右邊一個數字時鐘(包含時間和日期的文字),每秒更新一次模擬時鐘和數字時鐘。

本文基于鴻蒙ArkUI框架,實現了一個支持??模擬/數字雙模式顯示??、??手勢交互??與??動態主題切換??的時鐘應用。以下從技術架構、核心功能與創新交互三個維度展開解析。


??一、項目架構與技術棧??
  1. ??基礎框架??

    • 使用ArkUI聲明式開發范式(基于TypeScript),通過@Entry@Component裝飾器定義頁面組件。
    • 狀態管理:@State驅動UI動態更新(如時間文本、時鐘縮放比例、背景色)。
  2. ??依賴模塊??

    import { common } from '@kit.AbilityKit';  // 系統能力庫
    import { window } from '@kit.ArkUI';       // 窗口管理
    import { AnalogClockComponent } from './AnalogClockComponent'; // 自定義模擬時鐘組件
    • ??工具類封裝??:
      • DateUtil:時間格式化(getFormatDateStr生成HH:mm:ssyyyy年MM月dd日)。
      • AppUtil:設備控制(息屏保持、強制橫屏)。

??二、核心功能實現??
??1. 雙模式時鐘動態切換??
  • ??數字時鐘??:通過Text組件動態綁定時間與日期:

    @State timeText: string = '';  // 時間文本(HH:mm:ss)
    @State dateText: string = '';  // 日期文本(yyyy年MM月dd日)

    每秒更新數據:

    setInterval(() => this.load(), 1000); // 定時更新
  • ??模擬時鐘??:封裝為獨立組件AnalogClockComponent

    if (this.showClock) {AnalogClockComponent().scale({ x: this.clockScale, y: this.clockScale }) // 支持縮放.gesture(PinchGesture().onActionUpdate((event) => { // 捏合手勢調整縮放比例(0.5~1.5倍)this.clockScale = Math.max(0.5, Math.min(1.5, event.scale * this.lastClockScale));}))
    }
??2. 交互設計??
  • ??顯隱控制??:頂部按鈕切換模擬時鐘顯示狀態:
    Button().onClick(() => this.showClock = !this.showClock)
  • ??主題切換??:點擊屏幕切換黑/白主題:
    .onClick(() => {this.flag = !this.flag;this.fontColor = this.flag ? TimePage.blackColor : TimePage.whiteColor;this.bgColor = this.flag ? TimePage.whiteColor : TimePage.greyColor;
    })
  • ??動畫優化??:黑白主題切換時添加緩動動畫:
    Text(this.timeText).animation({ duration: 2000, curve: Curve.EaseOut })
??3. 設備適配與性能??
  • ??橫屏沉浸式體驗??:
    AppUtil.setPreferredOrientation(window.Orientation.AUTO_ROTATION_LANDSCAPE);
  • ??保持不息屏??:
    AppUtil.setWindowKeepScreenOn(true);

??三、關鍵技術點解析??
  1. ??狀態驅動UI更新??

    • @State變量(如timeTextbgColor)變化自動觸發UI重渲染。
    • 通過setInterval更新狀態,實現每秒刷新時間。
  2. ??手勢識別與動畫??

    • ??捏合縮放??:PinchGesture監聽手勢事件,動態計算縮放比例。
    • ??主題切換動畫??:頁面背景色與文字顏色變化時應用2000ms漸變動畫。
  3. ??組件化設計??

    • 模擬時鐘獨立封裝為AnalogClockComponent,通過Props控制尺寸與縮放,符合高內聚原則。
    • 工具類DateUtil解耦時間邏輯,提升代碼復用性。

??四、優化策略與設計理念??
  1. ??視覺層次設計??

    • ??主次分明??:數字時鐘使用100px大字體突出時間,日期文本使用30px小字體。
    • ??色彩對比??:深灰背景(#fefefe)與白色文字確保可讀性,夜間模式切換為深色文字+白色背景。
  2. ??響應式交互??

    • 手勢操作實時反饋(捏合縮放),限制縮放范圍避免UI變形。
    • 控件位置優化:控制按鈕置于右上角,避免遮擋核心內容。
  3. ??性能與功耗??

    • 頁面不可見時(onPageHide)清除定時器,減少資源占用。
    • 橫屏模式適配多種設備尺寸,通過Stack+Row/Column布局保證元素對齊。

??五、擴展方向??
  1. ??多時區支持??:擴展DateUtil,增加時區切換功能。
  2. ??動態背景??:根據時間自動切換日出/日落主題色。

??結語??

本文實現的ArkUI時鐘界面,通過??狀態驅動??、??手勢交互??與??組件化設計??,平衡了功能性與視覺體驗。其設計模式可復用于其他實時數據展示場景(如天氣儀表盤、健身數據統計)。未來可結合鴻蒙分布式能力,實現跨設備時鐘同步控制。


??設計原則總結??:

原則實現方式
??信息直觀性??雙模式時鐘互補顯示
??操作便捷性??手勢縮放+一鍵切換
??視覺舒適性??動態主題+緩動動畫
??性能優化??定時器生命周期管理

源碼中的AnalogClockComponent實現可參考《ArkUI自定義組件之模擬時》,重點利用Canvas繪圖與旋轉動畫實現指針效果。

具體代碼如下:

import { common } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { AppUtil } from './Utils/AppUtil';
import { DateUtil } from './Utils/DateUtil';
import { AnalogClockComponent } from './ClockPage/AnalogClockComponent';@Entry
@Component
struct TimePage {context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;intervalID: number = -1;@State timeText: string = '';@State dateText: string = '';@State showClock: boolean = true;@State lastClockScale: number = 1.35;@State clockScale: number = 1.35;bigFontSize: number = 100;smallFontSize: number = 30;static readonly whiteColor: string = '#fefefe';static readonly greyColor: string | Resource = $r('app.color.body_color');static readonly blackColor: string | Resource = '#000';@State bgColor: string | Resource = TimePage.greyColor;@State fontColor: string | Resource = TimePage.whiteColor;@State flag: boolean = falsenowDate = Date.now();load() {this.nowDate = Date.now();this.timeText = DateUtil.getFormatDateStr(this.nowDate, "HH:mm:ss");this.dateText = DateUtil.getFormatDateStr(this.nowDate, "yyyy年MM月dd日")}onPageShow(): void {this.load();this.intervalID = setInterval(() => {this.load();}, 1000);AppUtil.setWindowKeepScreenOn(true);AppUtil.setPreferredOrientation(window.Orientation.AUTO_ROTATION_LANDSCAPE);}onPageHide(): void {clearInterval(this.intervalID);}build() {Stack({ alignContent: Alignment.Top }) {// 主要內容區域Row() {if (this.showClock) {// 模擬時鐘組件Column() {AnalogClockComponent().width('60%').aspectRatio(1)}.scale({ x: this.clockScale, y: this.clockScale }).width('30%').height('100%').justifyContent(FlexAlign.Center).align(Alignment.Center).margin({ left: 30 }).gesture(PinchGesture().onActionStart((event: GestureEvent) => {this.lastClockScale = this.clockScale;}).onActionUpdate((event: GestureEvent) => {this.clockScale = Math.max(0.5, Math.min(1.5, event.scale * this.lastClockScale));}))}// 數字時間顯示Column() {Text(this.timeText).fontSize(this.bigFontSize).fontColor(this.fontColor).animation({duration: 2000,curve: Curve.EaseOut,iterations: 1,playMode: PlayMode.Normal})Text(this.dateText).fontSize(this.smallFontSize).fontColor(this.fontColor).animation({duration: 2000,curve: Curve.Ease,iterations: 1,playMode: PlayMode.Normal})}.layoutWeight(1).height('100%').justifyContent(FlexAlign.Center)}.width('100%').height('100%')// 頂部控制欄Row() {Button() {Image(this.showClock ? $r('app.media.ic_visibility_off') : $r('app.media.ic_visibility')).width(24).height(24).fillColor(this.fontColor).opacity(0.3)}.width(48).height(48).borderRadius(24).backgroundColor('transparent').onClick(() => {this.showClock = !this.showClock;})}.width('100%').justifyContent(FlexAlign.End).padding({ right: 20, top: 20 })}.onClick(() => {if (this.flag) {this.fontColor = TimePage.whiteColor;this.bgColor = TimePage.greyColor;} else {this.fontColor = TimePage.blackColor;this.bgColor = TimePage.whiteColor;}this.flag = !this.flag;}).backgroundColor(this.bgColor).animation({duration: 2000,curve: Curve.Ease,iterations: 1,playMode: PlayMode.Normal}).width('100%').height('100%')}
}

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

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

相關文章

ios簽名錯誤的解決辦法

另一種最常見的解決方案。在終端中運行以下命令。您應該添加自己的鑰匙串名稱和密碼。security lock-keychain temp.keychainsecurity unlock-keychain -pp ssw0rd temp.keychain在這種情況下,使用鑰匙串名稱為“temp”,其密碼為“p ssw0rd”。此外&am…

C#讀取OPCUA節點數據

本人第一次接觸OPCUA,如有不對的地方望指正,獲取的是公司的OPCUA服務器的數據 方式一: 測試環境: window11 vs2022 OPCFoundation.NetStandard.Opc.Ua .net framework 4.8 (2025-06-23 經過測試,.net8也可以使用這套.net …

OpenCV計算機視覺實戰(11)——邊緣檢測詳解

OpenCV計算機視覺實戰(11)——邊緣檢測詳解 0. 前言1. Sobel 算子與方向梯度1.1 Sobel 算子簡介1.2 實現過程 2. Laplacian 邊緣檢測2.1 Laplacian 算子簡介2.2 實現過程 3. Canny 算法3.1 Canny 算法簡介3.2 實現過程 小結系列鏈接 0. 前言 邊緣檢測能…

哈爾濱idc服務器租用-青蛙云

在數字化浪潮洶涌的當下,企業對于服務器的需求愈發強烈。哈爾濱作為東北地區重要的經濟文化中心,其 IDC 服務器租用市場也呈現出蓬勃發展的態勢。眾多企業在尋求 IDC 服務器租用時,青蛙云憑借自身顯著優勢脫穎而出,成為眾多用戶的…

Zephyr 系統深入解析:SoC 支持包結構與中斷調度器調優實踐

本文將全面深入講解 Zephyr RTOS 的 SoC 支持包設計架構(SoC Series / SoC Variant)、中斷系統實現、調度器原理、時間片與優先級調優技巧,以及如何在實際項目中構建自定義 SoC 支持包、實現高效的調度器策略和系統性能優化。全文超過 5000 字…

FPGA基礎 -- Verilog 結構建模之模塊參數值

Verilog 中模塊參數值(parameter)的使用,這是結構建模和模塊可配置設計的核心機制,廣泛應用于 總線寬度配置、流水線級數、功能開關、模塊復用 等場景。 一、什么是模塊參數值(parameter) parameter 是 Ver…

Skrill是什么?中國用戶能用嗎?安全嗎?完整指南

什么是Skrill? Skrill 前身為 Moneybookers,成立于 2001 年,總部位于英國倫敦,目前隸屬于 Paysafe 集團。作為一個多功能電子支付平臺,Skrill 支持全球 100 多個國家和地區、40 多種貨幣,被廣泛用于&#…

java+vue+SpringBoo校園部門資料管理系統(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔(1萬字以上)開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言:后端:Java 前端:vue框架:springboot數據庫:mysql 開發工具 JDK版本:JDK1.…

Java中的Map實現類詳解

Java中的Map實現類詳解 Java集合框架提供了多種Map接口的實現,每種實現都有其特定的使用場景和特點。以下是主要的Map實現類及其特性分析: 1. 通用Map實現 HashMap 特點:基于哈希表的實現,允許null鍵和null值線程安全&#xf…

Pytorch Lightning 進階 1 - 梯度檢查點(Gradient Checkpointing)

梯度檢查點(Gradient Checkpointing)是一種在深度學習訓練中優化顯存使用的技術,尤其適用于處理大型模型(如Transformer架構)時顯存不足的情況。下面用簡單的例子解釋其工作原理和優缺點: 核心原理 深度學…

SpreadJS 迷你圖:數據趨勢可視化的利器

引言 在數據處理和分析領域,直觀地展示數據趨勢對于理解數據和做出決策至關重要。迷你圖作為一種簡潔而有效的數據可視化方式,在顯示數據趨勢方面發揮著重要作用,尤其在與他人共享數據時,能夠快速傳達關鍵信息。SpreadJS 作為一款…

GESP2024年12月認證C++一級( 第三部分編程題(1)溫度轉換)

參考程序1&#xff1a; #include <cstdio> using namespace std;int main() {double K;scanf("%lf", &K);double C K - 273.15; //轉換為攝氏溫度 double F 32 C * 1.8; //轉換為華氏溫度 if (F > 212) //條件判斷 print…

從零開始手寫redis(18)緩存淘汰算法 FIFO 優化

項目簡介 大家好&#xff0c;我是老馬。 Cache 用于實現一個可拓展的高性能本地緩存。 有人的地方&#xff0c;就有江湖。有高性能的地方&#xff0c;就有 cache。 v1.0.0 版本 以前的 FIFO 實現比較簡單&#xff0c;但是 queue 循環一遍刪除的話&#xff0c;性能實在是太…

用Zynq實現脈沖多普勒雷達信號處理:架構、算法與實現詳解

用Zynq實現脈沖多普勒雷達信號處理:架構、算法與實現詳解 脈沖多普勒(PD)雷達是現代雷達系統的核心技術之一,廣泛應用于機載火控、氣象監測、交通監控等領域。其核心優勢在于能在強雜波背景下檢測運動目標,并精確測量其徑向速度。本文將深入探討如何利用Xilinx Zynq SoC(…

OpenCV CUDA模塊設備層-----線程塊級別的一個內存填充工具函數blockFill()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 在同一個線程塊&#xff08;thread block&#xff09;內&#xff0c;將 [beg, end) 范圍內的數據并行地填充為指定值 value。 它使用了 CUDA 線程…

SAP-ABAP:如何查詢 SAP 事務碼(T-Code)被包含在哪些權限角色或權限對象中

要查詢 SAP 事務碼&#xff08;T-Code&#xff09;被包含在哪些權限角色或權限對象中&#xff0c;可使用以下專業方法&#xff1a; &#x1f50d; 1. 通過權限瀏覽器 (SUIM) - 最推薦 事務碼&#xff1a;SUIM (權限信息系統) 操作步驟&#xff1a; 執行 SUIM → 選擇 “角色…

MySQL 多列 IN 查詢詳解:語法、性能與實戰技巧

在 MySQL 中&#xff0c;多列 IN 查詢是一種強大的篩選工具&#xff0c;它允許通過多字段組合快速過濾數據。相較于傳統的 OR 連接多個條件&#xff0c;這種語法更簡潔高效&#xff0c;尤其適合批量匹配復合鍵或聯合字段的場景。本文將深入解析其用法&#xff0c;并探討性能優化…

自由學習記錄(63)

編碼全稱&#xff1a;AV1&#xff08;Alliance for Open Media Video 1&#xff09;。 算力消耗大&#xff1a;目前&#xff08;截至 2025 年中&#xff09;軟件解碼 AV1 的 CPU 開銷非常高&#xff0c;如果沒有專門的硬件解碼單元&#xff0c;播放高清視頻時會很吃 CPU&#…

日本生活:日語語言學校-日語作文-溝通無國界(4)-題目:喜歡讀書

日本生活&#xff1a;日語語言學校-日語作文-溝通無國界&#xff08;4&#xff09;-題目&#xff1a;喜歡讀書 1-前言2-作文原稿3-作文日語和譯本&#xff08;1&#xff09;日文原文&#xff08;2&#xff09;對應中文&#xff08;3&#xff09;對應英文 4-老師評語5-自我感想&…

C++優化程序的Tips

轉自個人博客 1. 避免創建過多中間變量 過多的中間變量不利于代碼的可讀性&#xff0c;還會增加內存的使用&#xff0c;而且可能導致額外的計算開銷。 將用于同一種情況的變量統一管理&#xff0c;可以使用一種通用的變量來代替多個變量。 2. 函數中習慣使用引用傳參而不是返…