簡介
在 Android 10 中新增了深色模式,市面上適配的 App 也越來越多呀洲,其實早在 Android 6.0 開發(fā)者預覽版中就有深色模式审胸,只是在正式版被剔除。
目前能看到微信利凑,釘釘浆劲,推特等主流 App 實現(xiàn)了深色模式的適配嫌术,大致可以分為 App 內(nèi)手動切換和跟隨系統(tǒng)設(shè)置兩種方案。其中推特為 App 內(nèi)手動切換牌借,不受系統(tǒng)設(shè)置影響度气,微信和釘釘則不同,用戶可以在手動切換和跟隨系統(tǒng)中選擇(微信 v.7.0.16 會提示重啟 App)膨报。
實現(xiàn)深色模式的第一步就是要避免資源硬編碼磷籍,這和 App 國際化的實現(xiàn)類似,將相關(guān)資源放到對應的 strings.xml现柠、colors.xml 等文件中院领。
實現(xiàn)類型
- 自動適配 Force Dark
- App 內(nèi)切換
- 跟隨系統(tǒng)
自動適配 Force Dark
<item name="android:forceDarkAllowed">true</item>
快速實現(xiàn)深色模式可以使用 Force Dark ,需要 Android 10 及以上設(shè)備够吩,并且應用主題使用淺色主題(例如 Theme.Material.Light)比然,在深色主題上不生效(例如Theme.Material)。
Force Dark 主題配置的作用是在 Framework 層周循,給 paint 中的顏色轉(zhuǎn)換一下或者給圖像提供一個反色的 colorFilter强法。 View 同樣可以擁有該屬性,用于取消 View 級別的深色模式鱼鼓。
但是 Force Dark 效果一般拟烫,不推薦使用
App 內(nèi)切換
通過調(diào)用 AppCompatDelegate.setDefaultNightMode()方法,可以實現(xiàn)深淺色模式切換
/**
* MODE_NIGHT_NO: 使用亮色(light)主題迄本,不使用夜間模式
* MODE_NIGHT_YES:使用暗色(dark)主題硕淑,使用夜間模式
* MODE_NIGHT_AUTO:根據(jù)當前時間自動切換 亮色(light)/暗色(dark)主題
* MODE_NIGHT_FOLLOW_SYSTEM(默認選項):設(shè)置為跟隨系統(tǒng),通常為 MODE_NIGHT_NO
*
* @author : kai.mao
* @date : 2020/7/17
*/
public class DarkModeUtil {
/**
* 設(shè)置深色模式
*/
public static void setDarkMode(){
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
/**
* 設(shè)置淺色模式
*/
public static void setLightMode(){
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
/**
* 跟隨系統(tǒng)
*/
public static void setModeBySystem(){
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
}
}
跟隨系統(tǒng)
首先必須避免顏色等資源的硬編碼嘉赎,也就是要寫到 colors.xml 文件中置媳,然后 res 文件夾下創(chuàng)建 values-night 文件夾,將對應的深色模式資源放入公条,這樣當在系統(tǒng)設(shè)置中切換深色模式時拇囊,Actvity 會隨之切換主題(Activity 重新創(chuàng)建)
如果配置了 android:configChanges="uiMode",不會跟隨系統(tǒng)切換
適配記錄
-
小米
MIUI 11 切換深色模式以后靶橱,Launcher 可能會重啟
MIUI 12 切換深色模式寥袭,可能會出現(xiàn)反色
-
WebView
WebView 沒有應用主題,如果需要實現(xiàn)深色模式則需要修改 html