Android Theme.AppCompat 中,你應該熟悉的顏色屬性

建立一個 Android 工程,第一步,也是必不可少的一步,就是定製 Application 主題樣式。利用系統諸多屬性定義 App 各類 View 的默認樣式,可以減小 layout 文件中不少重複性的屬性設置代碼。在開發者官網 R.attr 欄目中,Google 列出了全部 Android SDK 中的系統級屬性。如何取捨,如何區分,又有哪些經常使用的屬性呢?本文就來列舉顏色相關的一些屬性介紹,以供參考。html

一般,在 res/values/styles.xml 文件中定義的 application 主題樣式裏,你可能見到的最多見的使用組合是這樣:android

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style>

</resources>複製代碼

事實上,遠不止這樣...git

Theme.AppCompat


自 Lollipop 開始,Android 系統引入 Material Design 風格,各個控件的呈現樣式大有改變。爲了在不一樣版本的系統中統一 UI 樣式,設置自定義的 Application Theme 的 parent 樣式爲 Theme.AppCompat 系列便可。好比這裏的 Theme.AppCompat.Light.NoActionBar 主題。程序員

關於 AppCompat 相關主題提供的系統屬性,能夠參考源碼:v7/appcompat/res/values-v21/themes_base.xmlgithub

同時,因爲部分屬性的版本兼容問題,爲了不添加多個版本的 styles 文件,能夠省略 android: 命名空間。微信

colorPrimaryapp

App Bar 的背景色,即 ActionBar,一般也是一個 App 的主題色調。不過 ActionBar 已經退出歷史舞臺,由 Toolbar 代替使用,可是 Toolbar 須要在 layout 文件中單獨使用 background 屬性設置背景色,如:ide

<android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" />複製代碼

colorPrimaryDark測試

status bar(狀態欄)背景色。僅做用於 Lollipop 及更高版本。字體

colorAccent

許多控件在選中狀態或獲取焦點狀態下使用這個顏色,常見有:

  • CheckBox:checked 狀態
  • RadioButton:checked 狀態
  • SwitchCompat:checked 狀態
  • EditText:獲取焦點時的 underline 和 cursor 顏色
  • TextInputLayout:懸浮 label 字體顏色
  • 等等

除了這三種常見的控制顏色屬性,事實上,還有一些顏色相關的屬性也是很是實用的。

android:navigationBarColor

navigation bar 背景色。僅做用於 Lollipop 及更高版本。

colorControlNormal

某些 Views 「normal」 狀態下的顏色,常見如:unselected CheckBox 和 RadioButton,失去焦點時的 EditText,Toolbar 溢出按鈕顏色,等等。

colorControlActivated

某種程度上,是 colorAccent 的替代者,好比對於 CheckBox 和 RadioButton 的 checked 狀態,colorControlActivated 屬性會覆蓋 colorAccent 屬性的對應顏色。

colorControlHighlight

全部可點擊 Views 觸摸狀態下的 Ripple(漣漪)效果。僅做用於 Lollipop 及更高版本。

colorButtonNormal

Button normal 狀態下的背景色。注意,這種設置與 Button 的 android:background 屬性改變背景色不一樣的是,前者在 Lollipop 及更高版本上會讓 Button 依舊保持陰影和 Ripple 觸摸效果。

android:windowBackground

窗口背景色,諸如此類的還有:android:backgroundandroid:colorBackground 等。

android:textColorPrimary

EditText 的 text color,等等文本顏色。

諸如此類,還有不少顏色相關的系統屬性。GitHubGist 上面有一份參考指南:Android Lollipop Widget Tinting Guide,列舉了經常使用控件的着色相關屬性。

ThemeOverlay.AppCompat


做爲 Application Theme 的 parent 主題,Theme.AppCompat 提供了諸多屬性設置 App 全局 Views 樣式。可是有時候,咱們仍是須要單獨給某個或者某些 View 設置與全局樣式不同的樣式。這種狀況下,ThemeOverlay.AppCompat 就派上用場啦。

正如命名所表達的含義通常,ThemeOverlay.AppCompat 系列主題用於覆蓋基本的 AppCompat.Theme 樣式,按照需求僅僅改變部分屬性的樣式。這裏列舉一些常見用法:

ThemeOverlay.AppCompat

繼承自 @style/Base.ThemeOverlay.AppCompat。這是一個空主題,可是卻將 AppCompat 主題中的相關屬性複製了一遍。這在給個別 View 單獨設置部分樣式時很是實用。舉個例子:

<style name="AppTheme.Secondary" parent="ThemeOverlay.AppCompat"> <item name="colorAccent">@color/colorPrimary</item> </style>複製代碼

而後再借助 android:theme 屬性使用在 layout 中的某個 View 上:

android:theme="@style/AppTheme.Secondary"複製代碼

在這個例子中,重寫了 colorAccent 屬性,同時保證其餘屬性繼續延用 parent 爲 Theme.AppCompat 的 AppTheme 中的設置。從 ThemeOverlay.AppCompat 文檔介紹中能夠看出,好比 colorPrimary 屬性是這樣複製的:

android:colorPrimary = ?attr/colorPrimary

若是 parent 使用 Theme.AppCompat 或者其餘主題就不行,至關於只設置 colorAccent 屬性,其餘屬性使用默認樣式。

ThemeOverlay.AppCompat.Light(Dark)

與 ThemeOverlay.AppCompat 不一樣的是,這個主題修改背景色、文本顏色、高亮狀態顏色來匹配 Light(Dark)主題。好比 Light 樣式下的白色背景裏,顯示黑色(Dark)文本;Dark 樣式下的黑色背景裏,顯示白色(Light)文本。

這個主題的使用場景能夠是這樣,好比咱們的全局主題是 Light,可是有一部分 UI 可能須要使用一個 Dark 樣式的背景,這種狀況下,每一個 View 單獨設置顏色就比較麻煩,能夠在 ViewGroup 中統一設置,好比:

<FrameLayout android:background=」@color/dark_background」 android:theme="@style/ThemeOverlay.AppCompat.Dark」> <TextView /> </FrameLayout>複製代碼

ThemeOverlay.AppCompat.Dark.ActionBar
ThemeOverlay.AppCompat.Light.ActionBar

相比而言,因爲 Toolbar 的普遍使用,這對主題使用的就比較多啦。前面咱們說過,colorControlNormal 和 textColorPrimary 屬性均可以影響 Toolbar 或者 ActionBar 的溢出按鈕顏色和溢出文本顏色,同時也改變着其餘 View 的顯示顏色。綜合考慮下,咱們不會使用在 Application Theme 使用這些屬性控制 Toolbar 的內容顏色,而是使用這對主題單獨設置給 Toolbar 的 theme 屬性。

好比全局使用的是 Light 主題,Toolbar 的背景色是藍色或者紅色之類的顏色,要求溢出按鈕的顏色是白色。若是沒有特殊設置的話,默認狀況下溢出按鈕顯示爲黑色。此時,即可以用上這個主題:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?android:attr/actionBarSize" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:background="?attr/colorPrimary">

</android.support.v7.widget.Toolbar>複製代碼

總結


系統主題提供的屬性樣式很是之多,同時也會相互影響,多對多關係,錯綜複雜,而且有些還會存在版本兼容問題,使用時必定要多多測試。固然,使用恰當的話,可以減小不少重複性的 xml 代碼,也方便後續 App 主題變動的需求,拓展之類的場景。

關於我:亦楓,博客地址:yifeng.studio/,新浪微博:IT亦楓

微信掃描二維碼,歡迎關注個人我的公衆號:安卓筆記俠

不只分享個人原創技術文章,還有程序員的職場遐想

相關文章
相關標籤/搜索