在鴻蒙中實現深色/淺色模式切換:從原理到可運行 Demo

在這里插入圖片描述

摘要

現在幾乎所有主流應用都支持“深色模式”和“淺色模式”切換,這已經成了用戶習慣。鴻蒙(HarmonyOS)同樣提供了兩種模式(dark / light),并且支持應用根據系統主題切換,或者應用內手動切換。對于開發者來說,如何配置和管理顏色資源,以及如何在代碼里實現動態切換,是必須掌握的技能。

本文會從原理到實戰,帶你實現一個可運行 Demo,并結合實際應用場景,比如電商、閱讀類和社交應用,展示不同的實現方式。

引言

早期很多應用為了“省事”,直接寫死了顏色值,結果一旦系統切換到深色模式,應用就顯得突兀、不協調。鴻蒙的做法比較科學,它提供了 資源限定目錄 的機制:在 resources 文件夾里,你可以為不同的顏色模式準備單獨的資源文件。

這樣一來,應用可以:

  • 跟隨系統主題自動切換;
  • 也可以在應用內部提供“主題開關”,讓用戶手動切換。

接下來我們分兩部分講:

配置資源文件(Light/Dark 模式的顏色文件);
代碼層實現動態切換

配置顏色資源

基礎做法

首先在 resources 文件夾下新建 Light/Dark 兩個目錄。方法是右鍵 -> New Resource Directory -> 勾選 Color Mode,這樣會自動生成 lightdark 兩個文件夾。

然后在各自的 element 文件夾下創建 color.json 文件,格式如下:

light/element/color.json

{"color": [{"name": "background","value": "#FFFFFF"},{"name": "font_color","value": "#000000"},{"name": "button_background","value": "#0000FF"}]
}

dark/element/color.json

{"color": [{"name": "background","value": "#000000"},{"name": "font_color","value": "#FFFFFF"},{"name": "button_background","value": "#1E90FF"}]
}

這樣就完成了“顏色資源”的配置。沒配置的情況下,應用會默認使用 base 目錄下的顏色值。

動態主題切換實現

跟隨系統主題

鴻蒙框架會自動根據系統主題選擇 lightdark 資源文件。也就是說,你只要準備好顏色資源,就能實現自動切換。

應用內主動切換

有時候,我們想給用戶一個“開關”,讓他們在應用內手動選擇主題。這時需要調用 UIAppearance 相關接口。

下面是一個最小化 Demo:

// Index.ets
import UIAppearance from '@ohos.arkui.UIAppearance';@Entry
@Component
struct Index {@State isDark: boolean = false;build() {Column({ space: 20 }) {Button(this.isDark ? '切換到淺色模式' : '切換到深色模式').onClick(() => {this.isDark = !this.isDark;UIAppearance.setColorMode(this.isDark ? 'dark' : 'light');})Text('當前主題:' + (this.isDark ? '深色模式' : '淺色模式')).fontColor($r('app.color.font_color')).backgroundColor($r('app.color.background')).fontSize(20).padding(20)}.width('100%').height('100%').backgroundColor($r('app.color.background'))}
}

在上面的代碼里:

  • 我們定義了一個 isDark 狀態來表示當前主題;
  • 點擊按鈕后,調用 UIAppearance.setColorMode 主動切換;
  • 文本和背景顏色都使用資源引用 $r('app.color.xxx'),這樣能保證跟隨主題變化。

場景應用

電商應用:商品展示

在電商類應用中,白天瀏覽商品時用淺色背景更舒服,晚上則希望用深色模式減少視覺刺激。

Text('¥199.00').fontColor($r('app.color.font_color')).fontSize(24).backgroundColor($r('app.color.background'))

解析:這里字體和背景顏色都是從資源文件里獲取的,系統切換主題時自動生效。

閱讀應用:夜間模式

閱讀類應用通常會提供獨立的“夜間模式開關”。即便系統是淺色模式,用戶也可能選擇在夜間用深色主題。

Toggle({ name: '夜間模式' }, this.isDark).onChange((value: boolean) => {this.isDark = value;UIAppearance.setColorMode(value ? 'dark' : 'light');})

解析:Toggle(開關組件)直接控制主題切換,體驗和閱讀器常見功能一致。

社交應用:個人設置頁面

在社交應用里,主題切換一般放在“設置”頁面。

Row() {Text('深色模式').fontSize(18)Switch({ checked: this.isDark }).onChange((val: boolean) => {this.isDark = val;UIAppearance.setColorMode(val ? 'dark' : 'light');})
}

解析:Switch 控件切換主題,同時更新全局 UI。用戶在“設置”里調整一次,就能影響所有頁面。

常見問題(Q&A)

Q1: 如果沒配置 dark 文件夾會怎樣?
A: 系統會默認使用 base 下的資源,也就是說不會報錯,但主題切換沒效果。

Q2: 為什么有時候顏色不跟隨主題?
A: 很可能是你在組件里直接寫死了顏色值,比如 #FFFFFF,而不是引用 $r('app.color.xxx')

Q3: 應用主動切換和系統主題沖突怎么辦?
A: 一般來說,跟隨系統是默認行為。如果你在應用里提供了“手動開關”,就要在邏輯上優先考慮用戶的選擇。

總結

鴻蒙的動態主題切換本質上依賴于 資源限定目錄 + UIAppearance API

  • 想跟隨系統?準備好 light/dark 資源就行。
  • 想主動切換?調用 UIAppearance.setColorMode()
  • 實際場景里,閱讀、電商、社交等應用都能用上主題切換功能,提升用戶體驗。

寫代碼時最重要的習慣是:不要寫死顏色值,全部走資源引用。這樣一來,主題切換就會自然生效,維護起來也輕松。

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

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

相關文章

Redux搭檔Next.js的簡明使用教程

Redux 是一個用于 JavaScript 應用的狀態管理庫,主要解決組件間共享狀態和復雜狀態邏輯的問題。當應用規模較大、組件層級較深或多個組件需要共享/修改同一狀態時,Redux 可以提供可預測、可追蹤的狀態管理方式,避免狀態在組件間混亂傳遞。Red…

SCAI采用公平發射機制成功登陸LetsBonk,60%代幣供應量已鎖倉

去中心化科學(DeSci)平臺SCAI宣布,其代幣已于今日以Fair Launch形式在LetsBonk.fun平臺成功發射。為保障資金安全與透明,開發團隊已將代幣總量的60%進行鎖倉,進一步提升社區信任與項目合規性。SCAI是一個專注于高質量科…

【Kubernetes系列】Kubernetes中的resources

博客目錄1. limits(資源上限)2. requests(資源請求)關鍵區別其他注意事項示例場景在 Kubernetes (k8s) 中,resources 用于定義容器的資源請求(requests)和限制(limits)&a…

hadoop 前端yarn 8088端口查看任務執行情況

圖中資源相關參數含義及簡單分析思路&#xff1a; 基礎資源搶占參數 Total Resource Preempted: <memory:62112, vCores:6> 含義&#xff1a;應用總共被搶占的資源量&#xff0c; memory:62112 表示累計被收回的內存&#xff08;單位通常是MB &#xff0c;結合Hadoop生態…

基于SpringBoot的個性化教育學習平臺的設計與實現(源碼+lw+部署文檔+講解等)

課題介紹在教育數字化轉型與學習者需求差異化的背景下&#xff0c;傳統學習平臺 “統一內容、統一進度” 的模式已顯局限。當前&#xff0c;平臺多提供標準化課程資源&#xff0c;無法根據學習者年齡、基礎、目標&#xff08;如升學、技能提升&#xff09;定制學習路徑&#xf…

UE5多人MOBA+GAS 48、制作閃現技能

文章目錄添加標簽添加GA_Blink添加標簽 CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Blink_Teleport)CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Blink_Cooldown)UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_Blink_Teleport, "Ability.Blink.Teleport"…

Swift 實戰:實現一個簡化版的 Twitter(LeetCode 355)

文章目錄摘要描述示例解決答案設計思路題解代碼分析測試示例和結果時間復雜度空間復雜度總結摘要 在社交媒體平臺里&#xff0c;推送機制是核心功能之一。比如你關注了某人&#xff0c;就希望在自己的時間線上能看到他們的最新消息&#xff0c;同時自己的消息也要能出現在別人…

在瀏覽器端使用 xml2js 遇到的報錯及解決方法

在瀏覽器端使用 xml2js 遇到的報錯及解決方法 一、引言 在前端開發過程中&#xff0c;我們常常需要處理 XML 數據。xml2js 是一個非常流行的用于將 XML 轉換為 JavaScript 對象的庫。然而&#xff0c;當我們在瀏覽器端使用它時&#xff0c;可能會遇到一些問題。本文將介紹在瀏覽…

eChart餅環pie中間顯示總數_2個以上0值不擠掉

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>環餅圖顯示總數</title><script src"https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js"></script><style>#main { widt…

Ansible 核心功能進階:自動化任務的靈活控制與管理

一、管理 FACTS&#xff1a;獲取遠程主機的 “身份信息”FACTS 是 Ansible 自動收集的遠程主機詳細信息&#xff08;類似 “主機身份證”&#xff09;&#xff0c;包括主機名、IP、系統版本、硬件配置等。通過 FACTS 可以動態獲取主機信息&#xff0c;讓 Playbook 更靈活1. 查看…

gRPC網絡模型詳解

gRPC協議框架 TCP層&#xff1a;底層通信協議&#xff0c;基于TCP連接。 TLS層&#xff1a;該層是可選的&#xff0c;基于TLS加密通道。 HTTP2層&#xff1a;gRPC承載在HTTP2協議上&#xff0c;利用了HTTP2的雙向流、流控、頭部壓縮、單連接上的多 路復用請求等特性。 gRPC層…

[優選算法專題二滑動窗口——將x減到0的最小操作數]

題目鏈接 將x減到0的最小操作數 題目描述 題目解析 問題重述 給定一個整數數組 nums 和一個整數 x&#xff0c;每次只能從數組的左端或右端移除一個元素&#xff0c;并將該元素的值從 x 中減去。我們需要找到將 x 恰好減為 0 的最少操作次數&#xff0c;如果不可能則返回 -…

AOP配置類自動注入

本文主要探究AopAutoConfiguration配置類里面的bean怎么被自動裝配的。代碼如下&#xff1a;package com.example.springdemo.demos.a05;import com.example.springdemo.demos.a04.Bean1; import com.example.springdemo.demos.a04.Bean2; import com.example.springdemo.demos…

云計算-K8s 實戰:Pod、安全上下文、HPA 、CRD、網絡策略、親和性等功能配置實操指南

簡介 此次圍繞Kubernetes 日常管理中的核心場景,提供了從基礎到進階的實操配置指南。內容涵蓋 9 大關鍵知識點:從使用 nginx 鏡像創建 QoS 類為 Guaranteed 的 Pod,到為 Pod 配置安全上下文以指定運行用戶和組;從自定義 Student 資源類型(CRD),到配置 Sidecar 實現跨命…

嵌入式LINUX——————TCP并發服務器

一、服務器1.服務器分類單循環服務器&#xff1a;只能處理一個客戶端任務的服務器 并發服務器&#xff1a;可同時處理多個客戶端任務的服務器二、TCP并發服務器的構建1.如何構建&#xff1f; &#xff08;1&#xff09;多進程&#xff08;每一次創建都非常耗時耗空間&#…

論文潤色不能降低文章的重復率

最近大家問到多的&#xff0c;你們潤色好了重復率會不會就降低了。這事兒啊&#xff0c;得從好幾個方面去剖析&#xff0c;今天咱們就一塊兒來探個究竟。咱們先得清楚&#xff0c;重復率檢測工具一般會把內容標記成兩類&#xff1a;一是那些和其他文獻在文字表達上高度相似的部…

Python爬蟲實戰:構建alltheplaces平臺地理信息數據采集系統

1. 引言 1.1 研究背景與意義 在大數據與智慧城市建設的推動下,地理位置信息(如餐館、景點、公共設施等 POI 數據)已成為商業分析、城市規劃、公共服務優化的核心基礎數據。alltheplaces 作為全球領先的開放場所數據平臺,整合了來自多個數據源的標準化信息,涵蓋場所名稱、…

HTML第三次作業

抽獎項目代碼<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>簡易抽獎轉盤</title><sty…

PyTorch 面試題及詳細答案120題(01-05)-- 基礎概念與安裝

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

云手機選哪個比較好用?

云手機作為基于云計算技術運行的一款虛擬手機&#xff0c;能夠幫助企業與個人用戶進行賬號多開和遠程訪問等多種功能&#xff0c;是手游玩家的首要選擇&#xff0c;能夠多開賬號掛機不卡頓&#xff0c;但是哪一款云手機更加流暢好用呢&#xff1f;對于熱衷于手游的玩家來說&…