天天看點

android 按鈕自定義

首先看實作效果截圖:

android 按鈕自定義

自定義背景的按鈕目前有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格式呢?

android 按鈕自定義

該格式相對于一般PNG圖檔來說,多了上下左右各一條1px的黑線。左、上黑線隔開了9個格子,當中一個格子(見上圖Strechable Area區域)聲明為可以進行拉伸。右、下兩條黑線所定義的Paddingbox區域是在該圖檔當做背景時,能夠在圖檔上填寫文字的區域。每條黑線都是可以不連續的,這樣就可以定義出很多自動拉伸的規格。Android(安卓) sdk中提供了設定的工具,啟動指令位于:$ANDROID_SDK/tools/draw9patch.bat,使用它對于原始PNG進行設定9- patch格式,非常友善,如下圖。

android 按鈕自定義
android 按鈕自定義

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) 設計一張自定義形狀風格背景的圖檔,如下圖。

android 按鈕自定義

(b) 未點選和按下後的狀态各做一張,形成一套圖檔,如下圖。

android 按鈕自定義

 forward.png  

android 按鈕自定義

  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"   />

上一篇: 居中對齊
下一篇: 網絡采集器

繼續閱讀