2021-07-07

在前一篇 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" />

2.在不同的主題背景中使用 不同:

<!-- 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)注本系列的下一篇的文章咱旱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末确丢,一起剝皮案震驚了整個(gè)濱河市绷耍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲜侥,老刑警劉巖褂始,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異描函,居然都是意外死亡崎苗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門舀寓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胆数,“玉大人,你說(shuō)我怎么就攤上這事互墓”啬幔” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵篡撵,是天一觀的道長(zhǎng)判莉。 經(jīng)常有香客問我,道長(zhǎng)酸休,這世上最難降的妖魔是什么骂租? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮斑司,結(jié)果婚禮上渗饮,老公的妹妹穿的比我還像新娘。我一直安慰自己宿刮,他們只是感情好互站,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著僵缺,像睡著了一般胡桃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磕潮,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天翠胰,我揣著相機(jī)與錄音,去河邊找鬼自脯。 笑死之景,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膏潮。 我是一名探鬼主播锻狗,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了轻纪?” 一聲冷哼從身側(cè)響起油额,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刻帚,沒想到半個(gè)月后潦嘶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡我擂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年衬以,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缓艳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片校摩。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阶淘,靈堂內(nèi)的尸體忽然破棺而出衙吩,到底是詐尸還是另有隱情,我是刑警寧澤溪窒,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布坤塞,位于F島的核電站,受9級(jí)特大地震影響澈蚌,放射性物質(zhì)發(fā)生泄漏摹芙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一宛瞄、第九天 我趴在偏房一處隱蔽的房頂上張望浮禾。 院中可真熱鬧,春花似錦份汗、人聲如沸盈电。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匆帚。三九已至,卻和暖如春旁钧,著一層夾襖步出監(jiān)牢的瞬間吸重,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工歪今, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嚎幸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓彤委,卻偏偏與公主長(zhǎng)得像鞭铆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 收錄 | 程路 | 原文地址[https://zhuanlan.zhihu.com/p/66278625] 這篇文...
    iOS猿_員閱讀 2,463評(píng)論 0 6
  • 原文作者:騰訊技術(shù)[https://zhuanlan.zhihu.com/tencent-TEG]原文鏈接:htt...
    LRachel閱讀 1,240評(píng)論 0 10
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒舶担。表情可以傳達(dá)很多信息坡疼。高興了當(dāng)然就笑了,難過就哭了衣陶。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,326評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者柄瑰,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn)剪况,也就放棄了無(wú)數(shù)的可能教沾。 ...
    yichen大刀閱讀 6,059評(píng)論 0 4