假設你需要在Android App上刻畫一個膠囊形狀的按鈕,也就是操場形狀(長方形+兩個半圓,或者說類橢圓),像是下圖這樣:
然而設計只有給你一個icon ,無法提供給你整個膠囊形狀的圖。(基於設計彈性也應該如此:畢竟右邊的文字可能需要依照語言替換,而按鈕整體大小也可能需要視環境調整、不能畫死)
那麼該怎麼做呢?
網路上有人說可以用java寫,但是java code拿來設定靜態介面實在太費事、不直觀、容易缺漏,可不可以只用XML做到呢?
答案是可以的,只要使用View的 android:background
— —指定其為特定drawable即可。
步驟1: 準備特殊形狀
在這裡,特殊形狀指的是膠囊形。在 res/drawable
裡面新增一個shape_capsule.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@android:color/background_light" />
<corners android:radius="900dp"/>
</shape>
小技巧:只要把角落corners
的半徑android:radius
數值設定為超大,就可以做到「角是半圓形」的效果。如果想針對單個角落設定,可以用android:topLeftRadius
/android:bottomRightRadius
/…等。
步驟2:套用background
創建一個 Button
並設定 android:background
為你剛剛創建的形狀:
完成!
上述的xml:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_capsule"
android:text="Button" />
如何染色/更換形狀色彩
直接指定
其實在shape裡面你也可以直接指定顏色。修改剛才的shape_capsule.xml、solid tag裡面的 android:color
即可。
小技巧:可以使用stroke tag來為shape指定邊線、或者使用gradient tag取代solid tag來製作漸層顏色。
使用Tint
如果你有很多個Button都要用不同color、又不想要每個Button重新創建一份shape,可以使用 android:tint
系列。 android:tint
是Android在Lollipop (Android 5.0 / API 21)引入的屬性,中文直接翻譯叫做「著色器」。一般是用來為圖形重新著色的。舉例來說,如果你有一張像是下圖的純色icon:
那麼你可以透過設定 android:tint
來為其重新著色:
上述的xml程式碼:
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_play"
android:tint="@android:color/holo_orange_light" />
為Button指派著色器Tint
為剛剛的Button指派 android:backgroundTint
:
完成!
上述的xml:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_capsule"
android:backgroundTint="@android:color/holo_orange_light"
android:text="Button" />
補充:如何在Button左側加上icon
只要使用 android:drawableStart
就可以囉!
也可以在其他方向放置drawable ( android:drawableTop
/ android:drawableBottom
/ android:drawableEnd
)。
上述xml:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_capsule"
android:backgroundTint="@android:color/holo_orange_light"
android:drawableStart="@drawable/ic_menu_30dp"
android:text="Button" />
注意:設定 android:drawableStart
系列的icon大小與調適是相當痛苦/幾乎辦不到的。如果無法拿到跟按鈕大小一致的icon,通常建議用Button+ImageView或者ImageButton+TextView組合製作。
懂得這些屬性的話,要做出一開始的Button形狀也只差調整padding與更改文字/圖示了。
如果你可以舉一反三、撰寫自定義的shape的話,那就可以製作出各種形狀的Button、甚至TextView囉!
我是雷哥,一位萌新開發者。歡迎與我交流、討論遊戲與Android App相關議題。如果我的文章有幫助到您,也請不吝給點掌聲 :)