android colorstatelist_Android 样式系统 | 主题背景属性
在 Android 樣式系統系列的前幾篇文章中,我們介紹了主題背景與樣式的區別,以及為什么說通過主題背景和公共主題背景屬性來分解您要實現的內容是一個不錯的主意,請點擊鏈接回顧:
Android 樣式系統 | 主題背景和樣式
Android 樣式系統 | 常見的主題背景屬性
- 深色主題https://developer.android.google.cn/guide/topics/ui/look-and-feel/darktheme
即使您當前不支持其他主題 (什么,您的應用還沒有支持深色主題?),我們依然建議您采用這種方法,因為這樣會讓新主題的采用變得更加簡單。
合格的 Colors 文件
您可以通過在不同的配置中添加不同的值來改變顏色 (例如,在 res/values/colors.xml 中和在 res/values-night/colors.xml 中的備選值里均定義 @color/foo),但我們依然建議您使用主題背景屬性來替代它們。對顏色層級的區分,會迫使您給顏色賦予語義化名稱,換句話說,您應該不會在給顏色命名為 @color/white 的同時,又為深色模式提供一個深色變體,這會讓人感到非常困惑。所以,您可能會想要使用一個語義化名稱,例如 @color/background。這種方法帶來的問題是它合并了顏色聲明和具體的值,因此,它并沒有指出顏色是可以或者能夠隨主題背景而變化的。@colors 的變化也會鼓勵您創造更多顏色。如果在不同的情境下要使用具有相同值的、新的語義化命名的顏色 (即,不是背景色但應該使用相同顏色),這時候您仍需要在 colors 文件中創建新的條目。通過使用主題背景屬性,我們可以將語義顏色的聲明從提供它們的值中區分開來,而且讓使用方更清楚地了解到顏色會隨主題背景而變化 (因為它們使用 ?attr/ 語法)。將顏色聲明保持為字面值,您就可以自定義應用使用的顏色調色板,并在主題背景級別修改它們,這會讓 color.xml 較小且易維護。這種方法的額外好處是,布局/樣式引用這些顏色時復用性變得更高。由于主題背景可以被覆蓋或者改變,因此這間接表示: 您不需要創建其他布局或樣式就可以更改某些顏色——您可以在相同的布局中使用不同的主題背景。始終使用?
在某些情況下,您或許不想按照主題背景更改顏色。例如,在 Material Design 規范文檔中提到,您可能希望在淺色和深色主題中均使用同一類型的顏色。- Material Design 規范文檔https://material.io/design/color/dark-theme.html#ui-application
當前發展狀況
當使用 ColorStateLists時,您可能也不會在您的布局/樣式中直接引用主題背景屬性。<View …??android:background="@color/primary_20"/>- ColorStateListshttps://developer.android.google.cn/reference/android/content/res/ColorStateList
這種單項 ColorStateList (即只提供單個默認顏色,而非每種狀態的不同顏色) 有助于減少您需要維護的顏色資源數量。它并沒有定義一個新的顏色資源的方式來手動為您 (每一個配置文件) 的 primary 顏色設置 alpha 值,而是通過改變當前主題背景中的 colorPrimary 的方式。如果您的原始顏色發生了變化,則只需要在一個地方進行更新,無需調整所有已更新的地方。
雖然此技術很有用,但仍有一些注意事項:1. 如果指定的顏色也具有 alpha 值,則 alpha 會被合并。例如,將 50% 的 alpha 應用于 50% 的不透明白色中,將產生 25% 的白色:
<selector … <item android:alpha="0.50" android:color="#80ffffff" />selector>因此,最好將主題背景顏色指定為完全不透明,然后使用 ColorStateLists 修改它們的 alpha。2. 僅在 API 23 中添加了 alpha 組件,因此,如果您的最小 sdk 低于這個版本,請確保使用支持此行為的 AppCompatResources.getColorStateList (并始終使用 android:alpha 命名空間,而絕不使用 app:alpha 命名空間)。- AppCompatResources.getColorStateListhttps://developer.android.google.cn/reference/androidx/appcompat/content/res/AppCompatResources.html#getColorStateList(android.content.Context,%20int)
- ColorDrawablehttps://developer.android.google.cn/reference/android/graphics/drawable/ColorDrawable
- ColorStateListDrawablehttps://developer.android.google.cn/reference/android/graphics/drawable/ColorStateListDrawable
強制執行
即使您已經說服自己使用主題背景屬性和 ColorStateList,但如何在代碼庫或者團隊中使用呢?您可以在 Code review 期間嘗試保持警惕,但它的擴展性不是很好。更好的方法是依靠工具來解決此問題?!禡aking Android Lint Theme Aware》這篇文章簡述了如何通過添加 Lint 檢查來尋找直接引用顏色的用法,并涵蓋了文中提及到的所有建議。《Making Android Lint Theme Aware》
https://proandroiddev.com/making-android-lint-theme-aware-6285737b13bc
間接使用
使用主題背景屬性和 ColorStateList 將顏色分解為主題背景的方法,可使您的布局和樣式更加靈活,提高代碼復用性并保持代碼庫的精簡和易維護性。我們將在后續文章中介紹更多主題背景的用法以及它們之間的相互影響,感興趣的讀者請繼續關注。推薦閱讀
?點擊屏末?|?閱讀原文?|?了解更多與 Android 界面相關的內容和教程總結
以上是生活随笔為你收集整理的android colorstatelist_Android 样式系统 | 主题背景属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果手机怎么关闭旋转屏幕
- 下一篇: python二级考试可以用pycharm