Android深色模式適配適配過程詳解


Android 深色模式適配
深色主題背景
Android 10 (API 級(jí)別 29) 及更高版本中提供深色主題背景。深色主題背景具有諸多優(yōu)勢(shì):
- 可大幅減少耗電量(具體取決于設(shè)備的屏幕技術(shù))。
- 為弱視以及對(duì)強(qiáng)光敏感的用戶提高可視性。
- 讓所有人都可以在光線較暗的環(huán)境中更輕松地使用設(shè)備。
深色主題背景同時(shí)適用于 Android 系統(tǒng)界面和在設(shè)備上運(yùn)行的應(yīng)用。
在應(yīng)用中支持深色主題背景
如要支持深色主題背景,必須將應(yīng)用的主題背景(通??稍?res/values/styles.xml 中找到)設(shè)置為繼承 DayNight 主題背景:
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
或者使用 MaterialComponent 的深色主題背景:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
這會(huì)將應(yīng)用的主要主題背景與系統(tǒng)控制的夜間模式標(biāo)記相關(guān)聯(lián),并將應(yīng)用的默認(rèn)主題背景設(shè)置為深色主題背景(如果已啟用)。
主題背景和樣式
主題背景和樣式應(yīng)避免使用旨在于淺色主題背景下使用的硬編碼顏色或圖標(biāo)。應(yīng)改用主題背景屬性(首選)或適合在夜間使用的資源。
以下是需要了解的兩個(gè)最重要的主題背景屬性:
?android:attr/textColorPrimary這是一種通用型文本顏色。它在淺色主題背景下接近于黑色,在深色主題背景下接近于白色。該顏色包含一個(gè)停用狀態(tài)。?attr/colorControlNormal一種通用圖標(biāo)顏色。該顏色包含一個(gè)停用狀態(tài)。
Force Dark
Android 10 提供 Force Dark 功能。此功能可讓開發(fā)者快速實(shí)現(xiàn)深色主題背景,而無需明確設(shè)置 DayNight 主題背景。
如果應(yīng)用采用淺色主題背景,則 Force Dark 會(huì)分析應(yīng)用的每個(gè)視圖,并在相應(yīng)視圖在屏幕上顯示之前,自動(dòng)應(yīng)用深色主題背景。有些開發(fā)者會(huì)混合使用 Force Dark 和本機(jī)實(shí)現(xiàn),以縮短實(shí)現(xiàn)深色主題背景所需的時(shí)間。
如果應(yīng)用選擇啟用 Force Dark,可以在其主題背景中設(shè)置 android:forceDarkAllowed="true"。此屬性會(huì)在所有系統(tǒng)及 AndroidX 提供的淺色主題背景(例如 Theme.Material.Light)上設(shè)置。
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="android:colorPrimary">@color/colorPrimary</item>
<item name="android:colorAccent">@color/colorAccent</item>
<item name="android:background">@color/colorPrimary</item>
<item name="windowNoTitle">true</item>
<!-- 啟用 Force Dark -->
<item name="android:forceDarkAllowed">true</item>
</style>
</resources>
如果應(yīng)用使用深色主題背景(例如Theme.Material),則系統(tǒng)不會(huì)應(yīng)用 Force Dark。同樣,如果應(yīng)用的主題背景繼承自 DayNight 主題背景,則系統(tǒng)不會(huì)應(yīng)用 Force Dark,因?yàn)闀?huì)自動(dòng)切換主題背景。
在視圖上停用 Force Dark
您可以通過 android:forceDarkAllowed 布局屬性或 setForceDarkAllowed() 在特定視圖上控制 Force Dark。
Android 10以上
創(chuàng)建項(xiàng)目SDK選擇API29: Android 10以上,res目錄下會(huì)分別創(chuàng)建淺色和深色的主題樣式。

其中values/themes.xml存放淺色模式主題,values-night/themes.xml存放深色模式主題。
如要切換主題背景,可以調(diào)用 AppCompatDelegate.setDefaultNightMode()。
配置變更
當(dāng)應(yīng)用的主題背景發(fā)生更改(無論是通過系統(tǒng)設(shè)置還是 AppCompat)時(shí),會(huì)觸發(fā) uiMode 配置變更。這意味著系統(tǒng)會(huì)自動(dòng)重新創(chuàng)建 Activity。
在某些情況下,可能希望應(yīng)用處理配置變更。例如,可能希望延遲配置變更時(shí)間,因?yàn)樵O(shè)備正在播放視頻。
應(yīng)用可以聲明,每個(gè) Activity 都可以處理 uiMode 配置變更,以自行處理深色主題背景的實(shí)現(xiàn):
<activity
android:name=".MyActivity"
android:configChanges="uiMode" />
當(dāng)某個(gè) Activity 聲明它會(huì)處理配置變更時(shí),系統(tǒng)會(huì)在出現(xiàn)主題背景變更時(shí)調(diào)用該 Activity 的 onConfigurationChanged() 方法。
如要檢查當(dāng)前采用的是哪種主題背景,應(yīng)用可以運(yùn)行如下代碼:
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int currentNightMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
// Night mode is not active, we're using the light theme
Log.i(TAG, "onConfigurationChanged: light");
break;
case Configuration.UI_MODE_NIGHT_YES:
// Night mode is active, we're using dark theme
Log.i(TAG, "onConfigurationChanged: dark");
break;
default:
break;
}
}
到此這篇關(guān)于Android深色模式適配適配過程詳解的文章就介紹到這了,更多相關(guān)Android深色模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android編程中Perferences的用法實(shí)例分析
這篇文章主要介紹了Android編程中Perferences的用法,以實(shí)例形式較為詳細(xì)的分析了配置文件preferences.xml的功能、定義及使用方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
實(shí)例講解Android中ViewPager組件的一些進(jìn)階使用技巧
這篇文章主要介紹了Android中ViewPager組件的一些進(jìn)階使用技巧,包括添加標(biāo)題與onPagerChangeListener監(jiān)聽使用等,需要的朋友可以參考下2016-03-03
Android 網(wǎng)絡(luò)html源碼查看器詳解及實(shí)例
這篇文章主要介紹了Android 網(wǎng)絡(luò)html源碼查看器詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03
Android自定義ViewGroup實(shí)現(xiàn)豎向引導(dǎo)界面
這篇文章主要為大家詳細(xì)介紹了Andoird自定義ViewGroup實(shí)現(xiàn)豎向引導(dǎo)界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
Android通過RemoteViews實(shí)現(xiàn)跨進(jìn)程更新UI示例
本篇文章主要介紹了Android通過RemoteViews實(shí)現(xiàn)跨進(jìn)程更新UI示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
Android自定義View實(shí)現(xiàn)圓形進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)圓形進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Android使用viewpager實(shí)現(xiàn)自動(dòng)無限輪播圖
這篇文章主要介紹了Android使用viewpager實(shí)現(xiàn)自動(dòng)無限輪播圖效果,實(shí)現(xiàn)方法大概有兩種,一種是viewpager+作為游標(biāo)的點(diǎn) 。另外一種是重寫viewpager,具體實(shí)現(xiàn)過程大家參考下本文2018-06-06

