首先看實作效果截圖:
自定義背景的按鈕目前有2種方式實作,矢量和位圖。
1. 矢量圖形繪制的方式
矢量圖形繪制的方式實作簡單,适合對于按鈕形狀和圖案要求不高的場合。步驟如下:
(a) 使用xml定義一個圓角矩形,外圍輪廓線實線、内填充漸變色,xml代碼如下。
view plain copy to clipboard print ?
01.//bg_alibuybutton_default.xml
02.<? xml version = "1.0" encoding = "utf-8" ?>
03.< layer-list xmlns:android = "http://schemas.android.com/apk/res/android" >
04. < item >
05. < shape android:shape = "rectangle" >
06. < solid android:color = "#FFEC7600" />
07. < corners
08. android:topLeftRadius = "5dip"
09. android:topRightRadius = "5dip"
10. android:bottomLeftRadius = "5dip"
11. android:bottomRightRadius = "5dip" />
12. </ shape >
13. </ item >
14. < item android:top = "1px" android:bottom = "1px" android:left = "1px" android:right = "1px" >
15. < shape >
16. < gradient
17. android:startColor = "#FFEC7600" android:endColor = "#FFFED69E"
18. android:type = "linear" android:angle = "90"
19. android:centerX = "0.5" android:centerY = "0.5" />
20. < corners
21. android:topLeftRadius = "5dip"
22. android:topRightRadius = "5dip"
23. android:bottomLeftRadius = "5dip"
24. android:bottomRightRadius = "5dip" />
25. </ shape >
26. </ item >
27.</ layer-list >
view plaincopy to clipboardprint?
02.<?xml
03. version="1.0" encoding="utf-8"?>
04.<layer-list
05.xmlns:android="http://schemas.android.com/apk/res/android">
06. <item>
07. <shape android:shape="rectangle">
08. <solid android:color="#FFEC7600" />
09. <corners
10. android:topLeftRadius="5dip"
11. android:topRightRadius="5dip"
12. android:bottomLeftRadius="5dip"
13. android:bottomRightRadius="5dip" />
14. </shape>
15. </item>
16. <item android:top="1px" android:bottom="1px" android:left="1px"
17.android:right="1px">
18. <shape>
19. <gradient
20. android:startColor="#FFEC7600" android:endColor="#FFFED69E"
21. android:type="linear" android:angle="90"
22. android:centerX="0.5" android:centerY="0.5" />
23. <corners
24. android:topLeftRadius="5dip"
25. android:topRightRadius="5dip"
26. android:bottomLeftRadius="5dip"
27. android:bottomRightRadius="5dip" />
28. </shape>
29. </item>
30.</layer-list>
//bg_alibuybutton_default.xml
<?xml
version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#FFEC7600" />
<corners
android:topLeftRadius="5dip"
android:topRightRadius="5dip"
android:bottomLeftRadius="5dip"
android:bottomRightRadius="5dip" />
</shape>
</item>
<item android:top="1px" android:bottom="1px" android:left="1px"
android:right="1px">
<shape>
<gradient
android:startColor="#FFEC7600" android:endColor="#FFFED69E"
android:type="linear" android:angle="90"
android:centerX="0.5" android:centerY="0.5" />
<corners
</item>
</layer-list>
同樣定義bg_alibuybutton_pressed.xml和 bg_alibuybutton_selected.xml,内容相同,就是漸變顔色不同,用于按鈕按下後的背景變化效果。
(b) 定義按鈕按下後的效果變化描述檔案drawable/bg_alibuybutton.xml,代碼如下。
01.<? xml version = "1.0" encoding = "UTF-8" ?>
02.< selector xmlns:android = "http://schemas.android.com/apk/res/android" >
03. < item android:state_pressed = "true"
04. android:drawable = "@drawable/bg_alibuybutton_pressed" />
05. < item android:state_focused = "true"
06. android:drawable = "@drawable/bg_alibuybutton_selected" />
07. < item android:drawable = "@drawable/bg_alibuybutton_default" />
08.</ selector >
01.<?xml
02. version="1.0" encoding="UTF-8"?>
03.<selector
04.xmlns:android="http://schemas.android.com/apk/res/android">
05. <item android:state_pressed="true"
06. android:drawable="@drawable/bg_alibuybutton_pressed" />
07. <item android:state_focused="true"
08. android:drawable="@drawable/bg_alibuybutton_selected" />
09. <item android:drawable="@drawable/bg_alibuybutton_default" />
10.</selector>
version="1.0" encoding="UTF-8"?>
<selector
<item android:state_pressed="true"
android:drawable="@drawable/bg_alibuybutton_pressed" />
<item android:state_focused="true"
android:drawable="@drawable/bg_alibuybutton_selected" />
<item android:drawable="@drawable/bg_alibuybutton_default" />
</selector>
(c) 在你需要的界面定義檔案中,如layout/main.xml中定義一個Button控件。
01.< Button
02. android:layout_width = "120dip"
03. android:layout_height = "40dip"
04. android:text = "矢量背景按鈕" android:background = "@drawable/bg_alibuybutton" />
01.
02. <Button
03. android:layout_width="120dip"
04. android:layout_height="40dip"
05. android:text="矢量背景按鈕"
06.android:background="@drawable/bg_alibuybutton" />
<Button
android:layout_width="120dip"
android:layout_height="40dip"
android:text="矢量背景按鈕"
android:background="@drawable/bg_alibuybutton" />
這樣,自定義背景的按鈕就可以使用了,在實作onClick方法後就可以響應操作。
2. 9-patch圖檔背景方式
此種方法相對複雜繁瑣,但可以制作出更多、更複雜樣式的按鈕圖樣。
什麼是9-patch格式呢?
該格式相對于一般PNG圖檔來說,多了上下左右各一條1px的黑線。左、上黑線隔開了9個格子,當中一個格子(見上圖Strechable Area區域)聲明為可以進行拉伸。右、下兩條黑線所定義的Paddingbox區域是在該圖檔當做背景時,能夠在圖檔上填寫文字的區域。每條黑線都是可以不連續的,這樣就可以定義出很多自動拉伸的規格。Android(安卓) sdk中提供了設定的工具,啟動指令位于:$ANDROID_SDK/tools/draw9patch.bat,使用它對于原始PNG進行設定9- patch格式,非常友善,如下圖。
draw9patch工具的右側是能夠看到各方向拉伸後的效果圖,你所要做的就是在圖上最外側一圈1px寬的像素上塗黑線。
注意,在draw9patch.bat第一次運作時,sdk2.2版本上會報錯:java.lang.NoClassDefFoundError:org/jdesktop/swingworker/SwingWorker。需要下載下傳swing-worker-1.1.jar ,放入$android_sdk/tools/lib路徑下,成功運作。
此種方法實作的步驟如下。
(a) 使用draw9patch.bat作完圖檔後,得到兩張按鈕背景,分别是正常和按下狀态下的,命名為bg_btn.9.png和 bg_btn_2.9.png。
(b) 編寫圖檔使用描述檔案bg_9patchbutton.xml。
01.// in bg_9patchbutton.xml
02.<? xml version = "1.0" encoding = "UTF-8" ?>
03.< selector xmlns:android = "http://schemas.android.com/apk/res/android" >
04. < item android:state_pressed = "true"
05. android:drawable = "@drawable/bg_btn_2" />
06. < item android:state_focused = "true"
07. android:drawable = "@drawable/bg_btn_2" />
08. < item android:drawable = "@drawable/bg_btn" />
09.</ selector >
01.//
02.in bg_9patchbutton.xml
03.<?xml version="1.0" encoding="UTF-8"?>
04.<selector
06. <item android:state_pressed="true"
07. android:drawable="@drawable/bg_btn_2" />
08. <item android:state_focused="true"
09. android:drawable="@drawable/bg_btn_2" />
10. <item android:drawable="@drawable/bg_btn" />
11.</selector>
//
in bg_9patchbutton.xml
<?xml version="1.0" encoding="UTF-8"?>
android:drawable="@drawable/bg_btn_2" />
<item android:drawable="@drawable/bg_btn" />
(c) 在界面定義檔案 layout/main.xml中添加Button、ImageButton按鈕控件的定義。Button、ImageButton都是可以使用背景屬性的。
04. android:text = "9-patch圖檔背景按鈕"
05. android:background = "@drawable/bg_9patchbutton" />
06.< Button
07. android:layout_width = "200dip"
08. android:layout_height = "40dip"
09. android:text = "9-patch圖檔背景按鈕"
10. android:background = "@drawable/bg_9patchbutton" />
11.< Button
12. android:layout_width = "120dip"
13. android:layout_height = "80dip"
14. android:text = "9-patch圖檔背景按鈕"
15. android:background = "@drawable/bg_9patchbutton" />
16.< ImageButton
17. android:layout_width = "120dip"
18. android:layout_height = "40dip"
19. android:src = "@drawable/bg_9patchbutton"
20. android:scaleType = "fitXY"
21. android:background = "@android:color/transparent" />
01.
02.<Button
03. android:layout_width="120dip"
04. android:layout_height="40dip"
05. android:text="9-patch圖檔背景按鈕"
06. android:background="@drawable/bg_9patchbutton" />
07. <Button
08. android:layout_width="200dip"
09. android:layout_height="40dip"
10. android:text="9-patch圖檔背景按鈕"
11. android:background="@drawable/bg_9patchbutton" />
12. <Button
13. android:layout_width="120dip"
14. android:layout_height="80dip"
15. android:text="9-patch圖檔背景按鈕"
16. android:background="@drawable/bg_9patchbutton" />
17. <ImageButton
18. android:layout_width="120dip"
19. android:layout_height="40dip"
20. android:src="@drawable/bg_9patchbutton"
21. android:scaleType="fitXY"
22. android:background="@android:color/transparent" />
android:text="9-patch圖檔背景按鈕"
android:background="@drawable/bg_9patchbutton" />
<Button
android:layout_width="200dip"
android:layout_height="80dip"
<ImageButton
android:src="@drawable/bg_9patchbutton"
android:scaleType="fitXY"
android:background="@android:color/transparent" />
以上2種實作按鈕的美化,都是标準的矩形按鈕為基礎。在一些應用中我們可以看到漂亮的自定義形狀的異形按鈕,這是怎麼實作的呢?經過一番研究和實踐,找出了一種友善的方法,就是使用ImageButton加上9-patch就可以實作漂亮的自動延伸效果。
3. 自定義形狀、顔色、圖樣的按鈕的實作
步驟如下。
(a) 設計一張自定義形狀風格背景的圖檔,如下圖。
(b) 未點選和按下後的狀态各做一張,形成一套圖檔,如下圖。
forward.png
forward2.png
(c) 建立和編寫按鈕不同狀态的圖檔使用描述檔案drawable/ib_forward.xml
01.// ib_forward.xml
05. android:drawable = "@drawable/forward2" />
07. android:drawable = "@drawable/forward2" />
08. < item android:drawable = "@drawable/forward" />
02.ib_forward.xml
07. android:drawable="@drawable/forward2" />
09. android:drawable="@drawable/forward2" />
10. <item android:drawable="@drawable/forward" />
ib_forward.xml
android:drawable="@drawable/forward2" />
<item android:drawable="@drawable/forward" />
(d) 在界面定義檔案 layout/main.xml中添加ImageButton按鈕控件的定義。
01.// in layout/main.xml
02. < ImageButton
03. android:layout_width = "80dip"
04. android:layout_height = "40dip"
05. android:src = "@drawable/ib_forword"
06. android:scaleType = "fitXY"
07. android:background = "@android:color/transparent" />