Android深色模式適配適配過(guò)程詳解
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)深色主題背景,而無(wú)需明確設(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
您可以通過(guò) 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ā)生更改(無(wú)論是通過(guò)系統(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ò)程詳解的文章就介紹到這了,更多相關(guān)Android深色模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android手勢(shì)密碼--設(shè)置和校驗(yàn)功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android手勢(shì)密碼--設(shè)置和校驗(yàn)功能的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考校驗(yàn)價(jià)值,需要的朋友可以參考下2018-05-05android自定義控件創(chuàng)建翻頁(yè)接口詳細(xì)代碼
這篇文章主要為大家介紹了android自定義控件創(chuàng)建翻頁(yè)接口詳細(xì)代碼,具有一定的實(shí)用性,感興趣的小伙伴們可以參考一下2016-07-07Android填坑系列:在小米系列等機(jī)型上放開定位權(quán)限后的定位請(qǐng)求彈框示例
本文詳細(xì)介紹了在小米系列等機(jī)型上放開定位權(quán)限后的定位請(qǐng)求彈框示例,例如在應(yīng)用軟件中提示顯示定位服務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11Android數(shù)據(jù)傳輸中的參數(shù)加密代碼示例
這篇文章主要介紹了Android數(shù)據(jù)傳輸中的參數(shù)加密代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11android開發(fā)之調(diào)用手機(jī)的攝像頭使用MediaRecorder錄像并播放
我們玩玩手機(jī)的錄像功能吧;今天做個(gè)調(diào)用手機(jī)的攝像頭使用MediaRecorder錄像并播放的DEMO,源碼很詳細(xì),感興趣的朋友可以了解下,希望本文對(duì)你有幫助2013-01-01Android UI設(shè)計(jì)系列之自定義Dialog實(shí)現(xiàn)各種風(fēng)格的對(duì)話框效果(7)
這篇文章主要介紹了Android UI設(shè)計(jì)系列之自定義Dialog實(shí)現(xiàn)各種風(fēng)格的對(duì)話框效果,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06Android BottomNavigationView底部導(dǎo)航效果
這篇文章主要為大家詳細(xì)介紹了Android BottomNavigationView底部導(dǎo)航效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01最常見的猜拳小游戲Android代碼實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了最常見的猜拳小游戲Android代碼實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Android應(yīng)用借助LinearLayout實(shí)現(xiàn)垂直水平居中布局
這篇文章主要介紹了Android應(yīng)用借助LinearLayout實(shí)現(xiàn)垂直水平居中布局的方法,文中列舉了LinearLayout線性布局下居中相關(guān)的幾個(gè)重要參數(shù),需要的朋友可以參考下2016-04-04