【譯】Android材質(zhì)組件的動(dòng)手實(shí)踐:Buttons

本文為 Nick Rout 發(fā)布于 Medium 的文章譯文(Google 翻譯)
原文鏈接為 Hands-on with Material Components for Android: Buttons
本文僅作為個(gè)人學(xué)習(xí)記錄所用吗货。如有涉及侵權(quán)局义,請(qǐng)相關(guān)人士盡快聯(lián)系譯文作者胞得。


Android MDC 系列文章:


這篇文章將介紹 Buttons 組件的功能和API颖侄。要了解如何處理Android的Material Components的初始設(shè)置(包括Gradle依賴關(guān)系和創(chuàng)建應(yīng)用程序主題),請(qǐng)參閱我的原始文章:

為Android設(shè)置Material Components主題

按鈕可以說是所有應(yīng)用程序中使用最廣泛的組件愤钾。這在很大程度上是由于其多功能性蛙讥,使用戶可以執(zhí)行操作并做出最終指導(dǎo)體驗(yàn)流程的選擇。單行包含的文本和/或圖標(biāo)表示按鈕可以執(zhí)行的操作遇西。

材質(zhì)按鈕與傳統(tǒng)的Android按鈕略有不同馅精,它們包含其他插圖(左側(cè)/右側(cè)為4dp),并且具有更多的字母間距粱檀,不同的默認(rèn)顏色以及其他屬性洲敢,這些屬性可以提高易讀性和承受能力。

傳統(tǒng) Android Button

從設(shè)計(jì)的角度來看梧税,有三種主要類型的按鈕沦疾,旨在提供層次結(jié)構(gòu)的強(qiáng)調(diào):

  • 文字按鈕(低強(qiáng)調(diào)):無(wú)容器。最適合用于次要?jiǎng)幼鞯诙樱绕涫窃谛枰獜?qiáng)調(diào)其他主要內(nèi)容時(shí)哮塞。
Text button
  • 輪廓按鈕(中等強(qiáng)調(diào)):撫摸的容器。最適合用于重要(但不是主要)動(dòng)作凳谦,并提供“較輕”的視覺感覺忆畅。
Outlined button
  • 包含的按鈕(重點(diǎn)突出):已裝滿容器。最適合應(yīng)引起用戶注意的主要操作尸执。這些可以升高也可以不升高家凯。
Unelevated (left) and raised (right) contained buttons

除此之外,還可以將按鈕分組為第四種類型:切換按鈕如失。這允許將相關(guān)的按鈕動(dòng)作水平地布置在公共容器中绊诲。可以選擇/取消選擇按鈕本身褪贵,以指示有效/無(wú)效的選擇掂之。

Toggle button

基本用法??

[MaterialButton](https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/button/MaterialButton.java)可以在您的布局中添加A ,如下所示:

< FrameLayout 
  ... > 

  < com.google.android.material.button.MaterialButton 
    android:id =“ @ + id / button” 
    android:layout_width =“ wrap_content” 
    android:layout_height =“ wrap_content” 
    android:text =“ Show” /> 

</ FrameLayout >

選擇風(fēng)格??

如以上介紹部分所述脆丁,存在各種按鈕類型世舰。這些類型映射到您可以應(yīng)用于的樣式MaterialButton。針對(duì)特定用例槽卫,還存在各種子樣式跟压,例如調(diào)整圖標(biāo)的填充。樣式及其屬性的完整列表可以在GitHub找到歼培。這些樣式變體繼承自Widget.MaterialComponents.Button震蒋,每個(gè)都有一個(gè)可選的樣式后綴:

  • 文本按鈕: *.TextButton(主)茸塞, ,*.TextButton.Icon喷好,*.TextButton.Snackbar翔横,,*.TextButton.Dialog``*.TextButton.Dialog.Icon``*.TextButton.Dialog.Flush
  • 概述按鈕:( *.OutlinedButton主要)梗搅,*.OutlinedButton.Icon
  • 包含的按鈕(未提升):( *.UnelevatedButton主)禾唁,*.UnelevatedButton.Icon
  • 包含的按鈕(凸起):無(wú)后綴(默認(rèn),主要)无切,*.Icon

添加圖標(biāo)??

可以將圖標(biāo)添加到按鈕荡短。它顯示在文本標(biāo)簽開頭的開頭。為了獲得正確的圖標(biāo)填充哆键,建議您使用*.Icon樣式變體(如上面“選擇樣式”部分中所示)掘托。

帶有圖標(biāo)的按鈕

可以用XML添加圖標(biāo):

< com.google.android.material.button.MaterialButton 
  ... 
  style =“ @ style / Widget.MaterialComponents.Button.Icon” 
  app:icon =“ @ drawable / ic_show_black_18dp” />

另外,也可以通過編程方式完成:

// Using icon resource ID
textButton.setIconResource(R.drawable.ic_show_black_18dp)
// Using icon Drawable
val showDrawable = AppCompatResources.getDrawable(context, R.drawable.ic_show_black_18dp)
textButton.icon = showDrawable

還有一些其他屬性可用于調(diào)整圖標(biāo)的大小和位置:

  • iconSize:圖標(biāo)的寬度/高度籍嘹。默認(rèn)值為提供Drawable的的固有寬度闪盔。
  • iconGravity:圖標(biāo)的位置∪枋浚可以將其設(shè)置為startICON_GRAVITY_START泪掀,默認(rèn)值,在按鈕的開頭)颂碘,endICON_GRAVITY_END异赫,在按鈕的結(jié)尾),textStartICON_GRAVITY_TEXT_START头岔,在居中的文本標(biāo)簽的開頭)或textEnd(ICON_GRAVITY_TEXT_END塔拳,在居中的文本標(biāo)簽的結(jié)尾)。

  • iconPadding:圖標(biāo)和文本標(biāo)簽之間的間距峡竣。通常靠抑,您不想更改此設(shè)置。文本按鈕的默認(rèn)值為4dp适掰,所有其他類型的默認(rèn)值為8dp孕荠。

與圖標(biāo)著色相關(guān)的屬性將在下面的“主題”部分中討論。

分組按鈕以創(chuàng)建切換按鈕???????????

為了創(chuàng)建一個(gè)切換按鈕攻谁,我們需要將MaterialButtons作為子View元素添加到[MaterialButtonToggleGroup](https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/button/MaterialButtonToggleGroup.java)(自定義ViewGroup)。

注意:*MaterialButtonToggleGroup*已在Android的材料組件1.1.0-alpha05版本添加弯予。

分組

這可以用XML完成:

< com.google.android.material.button.MaterialButtonToggleGroup 
  android:id =“ @ + id / toggleGroup” 
  android:layout_width =“ wrap_content” 
  android:layout_height =“ wrap_content” > 

  < com.google.android.material.button.MaterialButton 
    android:id =“ @ + id / button1” 
    ... /> 

  < com.google.android.material.button.MaterialButton 
    android:id =“ @ + id / button2” 
    ... /> 

  < com.google.android .material.button.MaterialButton 
    android:id =“ @ + id / button3” 
    ... /> 
</ com.google.android.material.button戚宦。MaterialButtonToggleGroup >

另外,也可以通過編程方式完成:

toggleGroup.addView(button1锈嫩、0受楼,layoutParams)
toggleGroup.addView(button2垦搬、1,layoutParams)
toggleGroup.addView(button3艳汽、2猴贰,layoutParams)

MaterialButtonToggleGroup手柄布局和行中只有相關(guān)的形狀角落的調(diào)整MaterialButton秒。MaterialButtons 的外觀取決于它們各自使用的樣式河狐。建議對(duì)所有孩子使用一致的樣式米绕,并建議使用概述的按鈕類型。

調(diào)整所選行為

添加到時(shí)MaterialButtonToggleGroup馋艺,子級(jí)會(huì)MaterialButton自動(dòng)變?yōu)椤翱蛇x”(即栅干,該android:checkable屬性設(shè)置為true)。

因此捐祠,存在一些用于調(diào)整如何MaterialButtonToggleGroup管理此屬性的屬性:

  • singleSelection:確定一次只能檢查組中的單個(gè)按鈕碱鳞。默認(rèn)值為false,表示可以獨(dú)立檢查/取消選中多個(gè)按鈕踱蛀。
singleSelection設(shè)置為true / false
  • selectionRequired:確定一次是否必須檢查組中的至少一個(gè)按鈕窿给。默認(rèn)值為false,表示可以取消選中所有按鈕率拒。
  • checkedButton:默認(rèn)情況下應(yīng)檢查的按鈕ID崩泡。默認(rèn)值View.NO_ID

監(jiān)聽選擇狀態(tài)

我們能夠以多種方式查詢和調(diào)整當(dāng)前選中的按鈕:

val checkedId = toggleGroup.checkedButtonId // Will return View.NO_ID if singleSelection = false
val checkedIds = toggleGroup.checkedButtonIds // Potentially an empty list
toggleGroup.check(R.id.button1) // Checks a specific button
toggleGroup.uncheck(R.id.button1) // Unchecks a specific button
toggleGroup.clearChecked() // Unchecks all buttons

我們還可以監(jiān)聽通過增加檢查的更改OnButtonCheckedListenerMaterialButtonToggleGroup

toggleGroup.addOnButtonCheckedListener { group, checkedId, isChecked ->
    // Do something for checked change
}

偵聽器也可以使用MaterialButtonToggleGroup#removeListenerMaterialButtonToggleGroup#clearListeners函數(shù)刪除俏橘。

取向

切換組中按鈕的默認(rèn)排列為水平允华。但是,MaterialButtonToggleGroup從extends LinearLayout來看寥掐,它還支持垂直排列靴寂。可以通過編程或XML設(shè)置:

< com.google.android.material.button.MaterialButtonToggleGroup 
    android:id =“ @ + id / toggleGroup” 
    ... 
    android:orientation =“ vertical” > 

    < com.google.android.material.button.MaterialButton 
        android:id = “ @ + id / button1” 
        android:layout_width =“ match_parent” 
        android:layout_height =“ wrap_content” 
        ... 
        android:insetTop =“ 0dp” 
        android:insetBottom =“ 0dp” 
        android:minHeight =“ 36dp” /> 

    ... 

</ com.google.android.material.button.MaterialButtonToggleGroup >
方向設(shè)置為垂直的切換按鈕

這里要注意的有趣事情是孩子的額外屬性MaterialButton召耘。它被推薦到的寬度設(shè)定為match_parent和以從子按鈕除去頂部/底部的插圖有他們齊平彼此垂直百炬。但是,這也需要進(jìn)行調(diào)整minHeight以彌補(bǔ)插圖的不足污它。

主題??

可以根據(jù)三個(gè)“材質(zhì)主題”子系統(tǒng)為按鈕設(shè)置主題:顏色剖踊,版式形狀。我們已經(jīng)在上面的“選擇樣式”部分中顯示了要使用的樣式衫贬。實(shí)施全局自定義MaterialButtonMaterialButtonToggleGroup樣式時(shí)德澈,請(qǐng)?jiān)谀膽?yīng)用程序主題中分別使用materialButtonStyle/ materialButtonOutlinedStylematerialButtonToggleGroupStyle屬性來引用它們。

顏色

MaterialButton可以使用該backgroundTint屬性自定義背景色固惯。這需要一個(gè)ColorStateList梆造,表示需要<selector>用于已檢查/啟用/禁用狀態(tài)。對(duì)于包含的按鈕葬毫,默認(rèn)為colorPrimary(啟用)/ colorOnSurface(禁用)镇辉,colorPrimary對(duì)于所有其他類型屡穗,默認(rèn)為透明(未選中)/ (選中),每個(gè)狀態(tài)的不透明性不同忽肛。還有一個(gè)backgroundTintMode屬性可以更改色調(diào)PorterDuff.Mode村砂,盡管通常您希望保持不變。

可以使用android:textColor屬性自定義文本標(biāo)簽的顏色屹逛。這也需要一個(gè)ColorStateList础废。對(duì)于所包含的按鈕,默認(rèn)為colorOnPrimary(啟用)/ colorOnSurface(禁用),對(duì)于所有其他類型,默認(rèn)為(啟用colorPrimary或選中)/ colorOnSurface(禁用或未選中)蚀狰,每個(gè)狀態(tài)的不透明性不同。

可選圖標(biāo)的顏色可以使用iconTint屬性來自定義歇僧。這也需要a ColorStateList,并且默認(rèn)設(shè)置與相同android:textColor锋拖。和以前一樣诈悍,還有一個(gè)iconTintMode屬性。

最后兽埃,可以使用該rippleColor屬性自定義按鈕觸摸波紋的顏色侥钳。它也接受a,ColorStateList并且colorOnPrimary對(duì)于包含的按鈕和colorPrimary所有其他類型默認(rèn)為柄错,每個(gè)狀態(tài)的不透明性不同舷夺。

顏色主題

版式

按鈕文字標(biāo)簽將采用fontFamily您的應(yīng)用主題中定義的屬性。

雖然您通常希望保持按鈕文本外觀的大多數(shù)方面不變售貌,但是《材料指南》建議给猾,如果需要,我們可以在文本標(biāo)簽的所有大寫字母上使用句子大小寫颂跨。為此敢伸,我們將創(chuàng)建一種新樣式:

< style name =“ ButtonTextAppearance” parent =“ TextAppearance.MaterialComponents.Button” > 
  < item name =“ android:textAllCaps” > false </ item > 
</ style >

我們可以將此android:textAppearance屬性直接引用到按鈕上,也可以將其應(yīng)用到單個(gè)按鈕樣式中恒削〕鼐保或者,可以通過在您的應(yīng)用程序主題中使用textAppearanceButton屬性引用它來全局應(yīng)用它钓丰。

字體樣式主題

形狀

可以使用該shapeAppearance屬性自定義按鈕背景的形狀躯砰。默認(rèn)為shapeAppearanceSmallComponent

盡管不是嚴(yán)格的形狀主題携丁,但值得一提的是琢歇,可以使用該strokeWidth屬性來調(diào)整輪廓按鈕筆觸的寬度。默認(rèn)為1dp。

形狀主題

更多資源??


我希望這篇文章對(duì)“材質(zhì)按鈕”以及如何在您的Android應(yīng)用程序中使用它們提供了一些見解。如果您有任何疑問尚揣,想法或建議涌矢,那么我很樂意收到您的來信!

在Twitter上找到我@ricknout

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末快骗,一起剝皮案震驚了整個(gè)濱河市娜庇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌方篮,老刑警劉巖名秀,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異藕溅,居然都是意外死亡匕得,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門巾表,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汁掠,“玉大人,你說我怎么就攤上這事集币】稼澹” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鞠苟,是天一觀的道長(zhǎng)乞榨。 經(jīng)常有香客問我,道長(zhǎng)当娱,這世上最難降的妖魔是什么吃既? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮趾访,結(jié)果婚禮上态秧,老公的妹妹穿的比我還像新娘。我一直安慰自己扼鞋,他們只是感情好申鱼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著云头,像睡著了一般捐友。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溃槐,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天匣砖,我揣著相機(jī)與錄音,去河邊找鬼。 笑死猴鲫,一個(gè)胖子當(dāng)著我的面吹牛对人,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拂共,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牺弄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了宜狐?” 一聲冷哼從身側(cè)響起势告,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抚恒,沒想到半個(gè)月后咱台,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俭驮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年回溺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片表鳍。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馅而,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出譬圣,到底是詐尸還是另有隱情瓮恭,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布厘熟,位于F島的核電站屯蹦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绳姨。R本人自食惡果不足惜登澜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望飘庄。 院中可真熱鬧脑蠕,春花似錦、人聲如沸跪削。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碾盐。三九已至晃跺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毫玖,已是汗流浹背掀虎。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工凌盯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烹玉。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓驰怎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親二打。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砸西,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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