在前一篇 Android 樣式系統(tǒng)文章中他嚷,我們介紹了主題背景與樣式的區(qū)別,以及如何編寫靈活的樣式與布局代碼用于抽離可變化部分秋泳。
我們建議使用主題背景屬性來(lái)間接引用資源,您可以在不同的模式下 (比如在 深色主題背景) 實(shí)現(xiàn)靈活地切換。如果您發(fā)現(xiàn)在布局或樣式代碼中直接引用了資源或者是硬編碼了具體的值咐熙,請(qǐng)考慮使用主題背景屬性來(lái)替代之前用法挺举。
<!-- Copyright 2019 Google LLC.
SPDX-License-Identifier: Apache-2.0 -->
<ConstraintLayout ...
- android:foreground="@drawable/some_ripple"
- android:background="@color/blue" />
+ android:foreground="?attr/selectableItemBackground"
+ android:background="?attr/colorPrimarySurface" />
但是我們還可以使用哪些主題背景屬性的功能呢杀赢?這篇文章列舉了您應(yīng)該知道的關(guān)于主題背景屬性的通用功能,它們廣泛應(yīng)用在 Material湘纵、AppCompact脂崔,或者是平臺(tái) (Platform) 中。本文并未完整列舉所有屬性梧喷,只列舉了我所使用的砌左,建議您瀏覽下面的屬性文件的定義鏈接來(lái)獲取更多信息。
顏色
這些顏色大部分來(lái)自于 Material 顏色系統(tǒng) (Material color system) 铺敌,它們給每個(gè)顏色取了語(yǔ)義化的名稱可以讓您在應(yīng)用中使用它們 (體現(xiàn)為主題背景屬性) 汇歹。
[圖片上傳失敗...(image-aed37f-1625623445933)]
- ?attr/colorPrimary 應(yīng)用的主要顏色;
- ?attr/colorSecondary 應(yīng)用的次要顏色偿凭,通常作為主要顏色補(bǔ)充秤朗;
- ?attr/colorOn[Primary, Secondary, Surface etc] 對(duì)應(yīng)顏色的相反色;
- ?attr/color[Primary, Secondary]Variant 給定顏色的另一種陰影笔喉;
- ?attr/colorSurface 部件的表面顏色取视,如: 卡片、表格常挚、菜單作谭;
- ?android:attr/colorBackground 屏幕的背景顏色;
- ?attr/colorPrimarySurface 在淺色主題中的 colorPrimary 與深色主題背景中的 colorSurface 中做切換奄毡;
- ?attr/colorError 顯示錯(cuò)誤時(shí)的顏色折欠。
其他常用的顏色:
- ?attr/colorControlNormal 正常狀態(tài)下設(shè)置給 icon/controls 的顏色;
- ?attr/colorControlActivated 激活模式下設(shè)置給 icons/controls 的顏色 (如: 單選框被勾選)吼过;
- ?attr/colorControlHighlight 設(shè)置給高亮控制界面的顏色 (如: ripples锐秦,列表選擇器);
- ?android:attr/textColorPrimary 設(shè)置給文本的主要顏色盗忱;
- ?android:attr/textColorSecondary 設(shè)置給文本的次要顏色酱床。
大小
- ?attr/listPreferredItemHeight 列表項(xiàng)的標(biāo)準(zhǔn)高度 (最小值);
- ?attr/actionBarSize 工具欄的高度趟佃。
Drawables
- ?attr/selectableItemBackground 可交互條目在 ripple 或者是高亮?xí)r的背景顏色 (針對(duì)外觀)扇谣;
- ?attr/selectableItemBackgroundBorderless 無(wú)邊界的 ripple昧捷;
- ?attr/dividerVertical 用于垂直分割可視化元素的 drawable;
- ?attr/dividerHorizontal 用于水平分割可視化元素的 drawable罐寨。
TextAppearance
Material 定義了縮放類型靡挥,它是在整個(gè)應(yīng)用中使用的一組由文本樣式組成的離散集合,集合中的每個(gè)值都是一個(gè)主題背景屬性鸯绿,可以被設(shè)置為 textApperance跋破。請(qǐng)點(diǎn)擊 Material type scale generator 獲得更多關(guān)于生成不同字體縮放的幫助。
[圖片上傳失敗...(image-1508f9-1625623445933)]
- ?attr/textAppearanceHeadline1 默認(rèn)為 96sp light 文本瓶蝴;
- ?attr/textAppearanceHeadline2 默認(rèn)為 60sp light 文本毒返;
- ?attr/textAppearanceHeadline3 默認(rèn)為 48sp regular 文本;
- ?attr/textAppearanceHeadline4 默認(rèn)為 34sp regular 文本囊蓝;
- ?attr/textAppearanceHeadline5 默認(rèn)為 24sp regular 文本饿悬;
- ?attr/textAppearanceHeadline6 默認(rèn)為 20sp medium 文本;
- ?attr/textAppearanceSubtitle1 默認(rèn)為 16sp regular 文本聚霜;
- ?attr/textAppearanceSubtitle2 默認(rèn)為 14sp medium 文本狡恬;
- ?attr/textAppearanceBody1 默認(rèn)為 16sp regular 文本;
- ?attr/textAppearanceBody2 默認(rèn)為 14sp regular 文本蝎宇;
- ?attr/textAppearanceCaption 默認(rèn)為 12sp regular 文本弟劲;
- ?attr/textAppearanceButton 默認(rèn)為 14sp 全大寫 medium 文本;
- ?attr/textAppearanceOverline 默認(rèn)為 10sp 全大寫 regular 文本姥芥。
形狀
Material 采用了形狀系統(tǒng) (Shape system)兔乞,它是由主題背景屬性 實(shí)現(xiàn) 了 small、medium凉唐、large 等不同的部件庸追。請(qǐng)注意,如果您想給自定義的部件設(shè)置形狀外觀台囱,您應(yīng)該使用 MaterialShapeDrawable 作為它的背景淡溯,因?yàn)樗軌蚶斫獠⒛軐?shí)現(xiàn)具體形狀。
[圖片上傳失敗...(image-261b6e-1625623445933)]
- ?attr/shapeAppearanceSmallComponent 默認(rèn)圓角為 4dp簿训,用于 Buttons咱娶、Chips、TextFields 等强品;
- ?attr/shapeAppearanceMediumComponent 默認(rèn)圓角為 4dp膘侮,用于 Cards、Dialogs的榛、Date Pickers 等琼了;
- ?attr/shapeAppearanceLargeComponent 默認(rèn)圓角為 0dp (其實(shí)是方形),用于 Bottom Sheets 等困曙。
按鈕風(fēng)格
[圖片上傳失敗...(image-fc296d-1625623445933)]
Material 提供了三種不同類型的按鈕: Contained表伦、Text 以及 Outlined谦去。MDC 提供了主題背景屬性慷丽,您可以使用它們給 MaterialButton 設(shè)置樣式:
- ?attr/materialButtonStyle defaults 默認(rèn)是 Contained 類型 (或者直接省略樣式)蹦哼;
- ?attr/borderlessButtonStyle 設(shè)置為 Text 樣式的按鈕;
- ?attr/materialButtonOutlinedStyle 設(shè)置為 Outlined 樣式的按鈕要糊。
Floats
- ?android:attr/disabledAlpha 默認(rèn)關(guān)閉 Widget 的 alpha纲熏;
- ?android:attr/primaryContentAlpha 設(shè)置給 foreground 元素的 alpha 值;
- ?android:attr/secondaryContentAlpha 設(shè)置給 secondary 元素的 alpha 值锄俄。
應(yīng)用命名空間 vs Android 命名空間
您可能注意到有些屬性的引用是通過 ?android:attr/foo 而有些只是通過 ?attr/bar局劲。這是因?yàn)橐恍傩允怯?Android 平臺(tái)定義的,所以您需要使用 android 命名空間來(lái)引用由它們自己定義的屬性 (類似于布局中使用 View 屬性 android:id) 奶赠。編譯到您的應(yīng)用但不是來(lái)自于靜態(tài)庫(kù)的屬性 (AppCompact 或者 MDC) 鱼填,使用它們時(shí)不需要命名空間 (類似于布局中使用 app:baz) 。平臺(tái)跟庫(kù)有時(shí)候定義了相同的屬性毅戈,如 colorPrimary苹丸。這時(shí)候系統(tǒng)優(yōu)先使用非平臺(tái)版本的屬性,它們可以被所有級(jí)別的 API 使用苇经。為了向后兼容赘理,它們會(huì)被完整的復(fù)制到庫(kù)中。我在上面列舉的都是非平臺(tái)版本的案例扇单。
優(yōu)先使用非平臺(tái)版本的屬性商模,它們可以被所有級(jí)別的 API 使用
更多資源
為了獲取可以使用的全部主題背景屬性,請(qǐng)查閱以下信息:
Material 設(shè)計(jì)的部件:
自己動(dòng)手
當(dāng)您想使用主題背景功能抽象某個(gè)東西的時(shí)候蜘澜,發(fā)現(xiàn)沒有現(xiàn)成的主題背景可用時(shí)施流,您可以自定義一個(gè)。您可以參考 Google I/O 應(yīng)用鄙信,它實(shí)現(xiàn)了在兩個(gè)界面中顯示主題演講的列表:
[圖片上傳失敗...(image-a0016d-1625623445933)]
這兩個(gè)界面大部分看起來(lái)比較相似瞪醋,除了左邊界面有個(gè)顯示時(shí)間的功能而右邊是沒有的。
將 item 的對(duì)齊部分抽象成一個(gè)主題背景屬性扮碧,給不同界面使用的同一個(gè)布局中使用主題背景來(lái)區(qū)分它們的差異:
1.在 attrs.xml 中定義主題背景屬性:
<!-- Copyright 2019 Google LLC.
SPDX-License-Identifier: Apache-2.0 -->
<attr name="sessionListKeyline" format="dimension" />
<!-- Copyright 2019 Google LLC.
SPDX-License-Identifier: Apache-2.0 -->
<style name="Theme.IOSched.Schedule">
…
<item name="sessionListKeyline">72dp</item>
</style>
<style name="Theme.IOSched.Speaker">
…
<item name="sessionListKeyline">16dp</item>
</style>
3.給兩個(gè)界面使用的布局文件中使用 主題背景屬性:
<!-- Copyright 2019 Google LLC.
SPDX-License-Identifier: Apache-2.0 -->
<Guideline …
app:layout_constraintGuide_begin="?attr/sessionListKeyline" />
保持探索
了解了能夠使用的主題背景屬性功能后趟章,您可以在編寫布局、樣式慎王、drawables 時(shí)使用它們蚓土。
使用主題背景屬性功能更容易實(shí)現(xiàn)主題功能 (如 深色主題背景),而且讓您編寫出更靈活赖淤,更易于維護(hù)的代碼蜀漆。更多關(guān)于此部分的內(nèi)容,敬請(qǐng)關(guān)注本系列的下一篇的文章咱旱。