Android Material Design 3 主題配色終極指南:XML 與 Compose 全解析

最小必要顏色配置

<!-- res/values/themes.xml -->
<style name="Theme.MyApp" parent="Theme.Material3.DayNight"><!-- 基礎三原色 --><item name="colorPrimary">@color/purple_500</item><item name="colorSecondary">@color/teal_200</item><item name="colorTertiary">@color/orange_200</item><!-- 背景+文字 --><item name="colorSurface">@color/white</item><item name="colorOnSurface">@color/black</item>
</style>

對應效果

  • 按鈕/導航欄:紫色
  • 開關/復選框:水綠色
  • 懸浮按鈕:橙色容器
  • 背景:白色
  • 文字:黑色

基礎控件顏色映射

控件使用的顏色屬性
按鈕colorPrimary + colorOnPrimary
開關colorSecondary
卡片colorSurface
文本colorOnSurface

XML 和 Compose 雙版本的完整代碼注釋,按功能模塊劃分:


一、基礎顏色配置

1. XML 版本 (res/values/themes.xml)
<!-- 主品牌色:用于FAB、主要按鈕等 -->
<item name="colorPrimary">@color/purple_500</item><!-- 主色上的內容色:確保與主色有足夠對比度 -->
<item name="colorOnPrimary">@color/white</item><!-- 次要品牌色:用于開關、單選按鈕等 -->
<item name="colorSecondary">@color/teal_200</item><!-- 背景系統:頁面基礎背景 -->
<item name="colorSurface">@color/white</item><!-- 背景上的內容色:普通文本顏色 -->
<item name="colorOnSurface">@color/black</item><!-- 錯誤色:錯誤提示文本/邊框 -->
<item name="colorError">@color/red_500</item>
2. Compose 版本 (Theme.kt)
val LightColorScheme = lightColorScheme(// 主色容器:FAB背景色primary = Color(0xFF6750A4),// 主色上的內容:FAB圖標顏色onPrimary = Color(0xFFFFFFFF),// 次要色:Switch滑塊顏色secondary = Color(0xFF958DA5),// 背景色:頁面底色surface = Color(0xFFFFFBFE),// 背景上的內容:普通文本onSurface = Color(0xFF1C1B1F),// 錯誤色error = Color(0xFFB3261E)
)

二、控件顏色映射

1. 按鈕 (Button)
<!-- XML版 -->
<Buttonandroid:backgroundTint="?attr/colorPrimary"android:textColor="?attr/colorOnPrimary"/>
// Compose版
Button(colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.primary,contentColor = MaterialTheme.colorScheme.onPrimary,// 禁用狀態顏色(自動降低透明度)disabledContainerColor = MaterialTheme.colorScheme.surfaceVariant,disabledContentColor = MaterialTheme.colorScheme.onSurfaceVariant)
) { Text("按鈕") }
2. 卡片 (Card)
<!-- XML版 -->
<androidx.cardview.widget.CardViewapp:cardBackgroundColor="?attr/colorSurface"app:strokeColor="?attr/colorOutline">
// Compose版
Card(colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface,contentColor = MaterialTheme.colorScheme.onSurface),border = CardDefaults.outlinedCardBorder(borderColor = MaterialTheme.colorScheme.outline)
) { /* 內容 */ }
3. 開關 (Switch)
<!-- XML版 -->
<Switchandroid:trackTint="?attr/colorSecondaryContainer"android:thumbTint="?attr/colorOnSecondary"/>
// Compose版
Switch(colors = SwitchDefaults.colors(checkedThumbColor = MaterialTheme.colorScheme.onSecondary,checkedTrackColor = MaterialTheme.colorScheme.secondary,uncheckedThumbColor = MaterialTheme.colorScheme.surfaceVariant,uncheckedTrackColor = MaterialTheme.colorScheme.onSurfaceVariant)
)

三、深色模式適配

1. XML 配置 (res/values-night/themes.xml)
<style name="Theme.MyApp" parent="Theme.Material3.DayNight"><!-- 深色背景 --><item name="colorSurface">@color/dark_surface</item><!-- 深色文字 --><item name="colorOnSurface">@color/dark_on_surface</item><!-- 深色輪廓線 --><item name="colorOutline">@color/dark_outline</item>
</style>
2. Compose 配置
val DarkColorScheme = darkColorScheme(surface = Color(0xFF1C1B1F),onSurface = Color(0xFFE6E1E5),outline = Color(0xFF938F99)
)@Composable
fun MyAppTheme(darkTheme: Boolean = isSystemInDarkTheme(),content: @Composable () -> Unit
) {val colorScheme = if (darkTheme) DarkColorScheme else LightColorSchemeMaterialTheme(colorScheme = colorScheme,content = content)
}

四、動態顏色(Android 12+)

1. XML 配置
<!-- res/values-v31/themes.xml -->
<style name="Theme.MyApp" parent="Theme.Material3.DayNight.DynamicColors"><item name="android:dynamicColorThemeOverlay">@style/ThemeOverlay.App.Dynamic</item>
</style>
2. Compose 集成
@Composable
fun DynamicColorWrapper(content: @Composable () -> Unit) {val context = LocalContext.currentval dynamicColor = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Sif (dynamicColor) {DynamicColors.rememberDynamicColors().apply {if (isDynamicColorAvailable) {LaunchedEffect(key1 = colorScheme) {// 動態顏色應用后的回調}}}}content()
}

五、完整主題構建示例

XML 全量配置
<style name="Theme.MyApp" parent="Theme.Material3.DayNight"><!-- 主色系 --><item name="colorPrimary">@color/primary_500</item><item name="colorOnPrimary">@color/white</item><item name="colorPrimaryContainer">@color/primary_100</item><!-- 文字系統 --><item name="textColorPrimary">?attr/colorOnSurface</item><item name="textColorSecondary">?attr/colorOnSurfaceVariant</item><!-- 控件狀態 --><item name="colorControlNormal">?attr/colorOnSurface</item><item name="colorControlActivated">?attr/colorPrimary</item>
</style>
Compose 全量主題
private val Typography = Typography(// 標題文字樣式titleLarge = TextStyle(fontFamily = FontFamily.Default,fontWeight = FontWeight.Bold,fontSize = 22.sp,color = MaterialTheme.colorScheme.onSurface),// 正文樣式bodyMedium = TextStyle(fontFamily = FontFamily.Default,fontWeight = FontWeight.Normal,fontSize = 16.sp,color = MaterialTheme.colorScheme.onSurface)
)@Composable
fun MyAppTheme(content: @Composable () -> Unit) {MaterialTheme(colorScheme = if (isDarkTheme()) DarkColorScheme else LightColorScheme,typography = Typography,shapes = Shapes(),content = content)
}

關鍵注意事項

  1. XML 與 Compose 混用場景

    // 在Compose中使用XML定義的顏色
    val color = Color(ContextCompat.getColor(context, R.color.primary_500))
    
  2. 顏色覆蓋優先級

    控件直接設置 > 樣式定義 > 主題默認值
    
  3. 調試命令

    # 查看當前主題屬性
    adb shell dumpsys activity top | grep "mTheme"
    

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

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

相關文章

【Git】“warning: LF will be replaced by CRLF”的解決辦法

一、原因分析 不同操作系統的換行符標準不同&#xff1a; ? Windows&#xff1a;使用 CRLF&#xff08;\r\n&#xff09;表示換行&#xff1b; ? Linux/Mac&#xff1a;使用 LF&#xff08;\n&#xff09;表示換行 Git 檢測到本地文件的換行符與倉庫設置或目標平臺不兼容時…

PyTorch 深度學習實戰(33):聯邦學習與隱私保護

在上一篇文章中,我們探討了多模態學習與CLIP模型的應用。本文將深入介紹聯邦學習(Federated Learning)這一新興的分布式機器學習范式,它能夠在保護數據隱私的前提下實現多方協作的模型訓練。我們將使用PyTorch實現一個基礎的聯邦學習框架,并在圖像分類任務上進行驗證。 一…

藍橋杯 web 展開你的扇子(css3)

普通答案&#xff1a; #box:hover #item1{transform: rotate(-60deg); } #box:hover #item2{transform: rotate(-50deg); } #box:hover #item3{transform: rotate(-40deg); } #box:hover #item4{transform: rotate(-30deg); } #box:hover #item5{transform: rotate(-20deg); }…

LLM驅動的智能體:基于GPT的對話智能體開發指南

前言 大語言模型&#xff08;LLM, Large Language Model&#xff09;正在徹底改變智能體&#xff08;Agent&#xff09;的設計和實現方式。從簡單的聊天機器人到復雜的自動化助手&#xff0c;基于GPT等LLM的對話智能體已經在客服、教育、辦公自動化、編程助手等領域得到了廣泛…

深度解析 C# 中介者模式:設計與實戰應用

中介者模式&#xff08;Mediator Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是將多個對象之間的交互集中到一個中介者對象中&#xff0c;從而減少對象之間的直接交互&#xff0c;降低耦合度。在實現復雜系統時&#xff0c;中介者模式有助于提高系統的可維…

每日算法-250408

記錄今天解決的兩道 LeetCode 算法題&#xff0c;主要涉及二分查找的應用。 1283. 使結果不超過閾值的最小除數 題目描述 思路 核心思路是 二分查找。 解題過程 為什么可以使用二分&#xff1f; 關鍵在于單調性。對于一個固定的數組 nums&#xff0c;當除數 divisor 增大時&…

MySQL的子查詢

一、前言 MySQL 子查詢是指嵌套在其他 SQL 語句&#xff08;如 SELECT、WHERE、FROM 等&#xff09;內部的查詢。用于輔助主查詢完成復雜的數據篩選或計算。 二、子查詢分類 標量子查詢 描述&#xff1a;返回 單行單列&#xff08;一個值&#xff09;&#xff0c;常用于比較運…

Linux 基礎入門操作 前言 VIM的基本操作 2

1 VIM的背景介紹 Vi 的誕生與1976年&#xff0c;Vim 的前身是 Vi&#xff08;Visual Editor&#xff09;&#xff0c;由 Bill Joy 在 BSD Unix 系統上開發&#xff0c;作為 ed&#xff08;行編輯器&#xff09;的改進版本&#xff0c;提供全屏編輯功能&#xff0c;成為 Unix/L…

Java:Set操作

目錄 Set 轉 List Set 轉 List Set<String>set new HashSet<String>(); set.add("c"); set.add("d"); set.add("a"); set.add("a");//方法一&#xff1a; List<String>list new ArrayList<String>(set);//…

算力驅動未來:從邊緣計算到高階AI的算力革命

算力驅動未來&#xff1a;從邊緣計算到高階AI的算力革命 摘要 本文深入探討了不同算力水平&#xff08;20TOPS至160TOPS&#xff09;在人工智能領域的多樣化應用場景。從邊緣計算的實時目標檢測到自動駕駛的多傳感器融合&#xff0c;從自然語言處理的大模型應用到AI for Scie…

虛擬機上安裝openEuler和openGauss數據庫

1.虛擬機版本選擇VM 16 PRO 2.openEuler版本選擇openEuler-22.03-LTS-SP4-x86_64 下載地址&#xff1a;https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP4/ISO/x86_64/openEuler-22.03-LTS-SP4-x86_64-dvd.iso 3.虛擬機安裝openEuler過程&#xff1a; 4.安裝ope…

0_Pytorch中的張量操作

[引言]張量的概念 1.基本概念 張量是一個通用的多維數組&#xff0c;可以表示標量&#xff08;0 維&#xff09;、向量&#xff08;1 維&#xff09;、矩陣&#xff08;2 維&#xff09;以及更高維度的數據。張量是 PyTorch 中的核心數據結構&#xff0c;用于表示和操作數據。…

LS-LINUX-002 簡易創建SSH

LS-LINUX-002 簡易創建SSH 1. CentOS 8 創建和配置SSH服務 1.1 安裝SSH服務 CentOS 8 默認已經安裝了OpenSSH服務。如果沒有安裝&#xff0c;可以使用以下命令安裝&#xff1a; sudo dnf install -y openssh-server1.2 啟動SSH服務 安裝完成后&#xff0c;需要啟動SSH服務…

計算機專業求職面試的常見題目分類整理

以下是計算機專業求職面試的常見題目分類整理&#xff0c;每個大類精選20道高頻問題&#xff0c;結合參考內容進行解析與擴展&#xff0c;幫助系統化備考&#xff1a; 一、數據結構與算法 解釋時間復雜度和空間復雜度 時間復雜度衡量算法執行時間隨輸入規模的增長趨勢&#xf…

腳本啟動 Java 程序

如果你想在后臺啟動一個 Java 程序&#xff0c;并在終端窗口中顯示一個自定義的名字&#xff0c;可以通過編寫一個簡單的腳本來實現。以下是一個基于 Linux/macOS 的解決方案&#xff0c;使用 Bash 腳本啟動 Java 程序&#xff0c;并在終端窗口中顯示自定義標題。 示例腳本 創建…

CentOS禁用nouveau驅動

1、驗證 nouveau 是否在運行 lsmod | grep nouveau如果命令返回結果&#xff0c;說明 nouveau 驅動正在運行。 2、編輯黑名單文件 通過編輯黑名單配置文件來禁用 nouveau 驅動&#xff0c;這樣在系統啟動時不會加載它。 vi /etc/modprobe.d/blacklist-nouveau.conf修改以下…

Linux: network: tcpdump: packets dropped by kernel

文章目錄 最近遇到一個問題原因libpcap/tcpdump 接口linux/libpcap 接口內核的處理原因可能有以下幾種:解決方法:man pcap_stats最近遇到一個問題 tcpdump命令顯示有dropped的包,而且是被內核drop的。 [root@-one-01 ~]# tcpdump -i any udp and port 8080 -v -w /root/udp…

WEB安全--提權思路

一、情形 在我們成功上傳webshell到服務器中并拿到權限時&#xff0c;發現我們的權限很低無法執行特定的命令&#xff0c;這時為了能做更多的操作&#xff0c;我們就需要提升權限。 二、方式 2.1、Windows提權 1、普通用戶執行systeminfo命令獲取服務器的基本信息&#xff0…

001 vue

https://cn.vuejs.org/ 文章目錄 v-bindv-modelv-on修飾符條件渲染/控制&#xff1a;v-if v-show列表渲染 M&#xff1a;即Model&#xff0c;模型&#xff0c;包括數據和一些基本操作 V&#xff1a;即View&#xff0c;視圖&#xff0c;頁面渲染結果 VM&#xff1a;即View-Mode…

Tomcat 負載均衡

目錄 二、Tomcat Web Server 2.1 Tomcat 部署 2.1.1 Tomcat 介紹 2.1.2 Tomcat 安裝 2.2 Tomcat 服務管理 2.2.1 Tomcat 啟停 2.2.2 目錄說明 2.2.3編輯主頁 2.3 Tomcat管理控制臺 2.3.1開啟遠程管理 2.3.2 配置遠程管理密碼 三、負載均衡 3.1 重新編譯Nginx 3.1.1 確…