android自定義button樣式
【原文:http://blog.csdn.net/lucherr/article/details/7476941】
在Android開發應用中,預設的Button是由系統渲染和管理大小的。而我們看到的成功的移動應用,都是有著酷炫的外觀和使用體驗的。因此,我們在開發產品的時候,需要對預設按鈕進行美化。在本篇裡,筆者結合在應用開發中的經驗,探討一下自定義背景的按鈕、自定義形狀按鈕的實現方法。
首先看實現效果截圖:
自定義背景的按鈕目前有2種方式實現,向量和點陣圖。
1. 向量圖形繪製的方式
向量圖形繪製的方式實現簡單,適合對於按鈕形狀和圖案要求不高的場合。步驟如下:
(a) 使用xml定義一個圓角矩形,外圍輪廓線實線、內填充漸變色,xml程式碼如下。
- //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
- android:topLeftRadius="5dip"
- android:topRightRadius="5dip"
- android:bottomLeftRadius="5dip"
- android:bottomRightRadius="5dip" />
- </shape>
- </item>
- </layer-list>
同樣定義bg_alibuybutton_pressed.xml和bg_alibuybutton_selected.xml,內容相同,就是漸變顏色不同,用於按鈕按下後的背景變化效果。
(b) 定義按鈕按下後的效果變化描述檔案drawable/bg_alibuybutton.xml,程式碼如下。
- <?xml version="1.0" encoding="UTF-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <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控制元件。
- <Button
- android:layout_width="120dip"
- android:layout_height="40dip"
- android:text="向量背景按鈕" android:background="@drawable/bg_alibuybutton" />
這樣,自定義背景的按鈕就可以使用了,在實現onClick方法後就可以響應操作。
2. 9-patch圖片背景方式
此種方法相對複雜繁瑣,但可以製作出更多、更復雜樣式的按鈕圖樣。
什麼是9-patch格式呢?
9-patch格式,是在Android中特有的一種PNG圖片格式,以"***.9.png"結尾。此種格式的圖片定義了可以伸縮拉伸的區域和文字顯示區域,這樣,就可以在Android開發中對非向量圖進行拉伸而仍然保持美觀。如果使用點陣圖而沒有經過9-patch處理的話,效果就會想第一張截圖中的“普通圖片背景按鈕”那樣被無情的拉伸,影響效果。Android中大量用了這種技術,預設的按鈕的背景就是用了類似的方法實現的。我們看一下google官方的描述:
該格式相對於一般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。
- // in bg_9patchbutton.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/bg_btn_2" />
- <item android:state_focused="true"
- android:drawable="@drawable/bg_btn_2" />
- <item android:drawable="@drawable/bg_btn" />
- </selector>
(c) 在介面定義檔案 layout/main.xml中新增Button、ImageButton按鈕控制元件的定義。Button、ImageButton都是可以使用背景屬性的。
- <Button
- android:layout_width="120dip"
- android:layout_height="40dip"
- android:text="9-patch圖片背景按鈕"
- android:background="@drawable/bg_9patchbutton" />
- <Button
- android:layout_width="200dip"
- android:layout_height="40dip"
- android:text="9-patch圖片背景按鈕"
- android:background="@drawable/bg_9patchbutton" />
- <Button
- android:layout_width="120dip"
- android:layout_height="80dip"
- android:text="9-patch圖片背景按鈕"
- android:background="@drawable/bg_9patchbutton" />
- <ImageButton
- android:layout_width="120dip"
- android:layout_height="40dip"
- 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
- // ib_forward.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/forward2" />
- <item android:state_focused="true"
- android:drawable="@drawable/forward2" />
- <item android:drawable="@drawable/forward" />
- </selector>
(d) 在介面定義檔案 layout/main.xml中新增ImageButton按鈕控制元件的定義。
- // in layout/main.xml
- <ImageButton
- android:layout_width="80dip"
- android:layout_height="40dip"
- android:src="@drawable/ib_forword"
- android:scaleType="fitXY"
- android:background="@android:color/transparent" />
相關文章
- Houdini - 建立自定義的button樣式
- android問題之Button自定義樣式selector後,點選無效果Android
- Android程式碼實現自定義ButtonAndroid
- 自定義Toast樣式AST
- 【Android開發點滴】自定義Toast樣式AndroidAST
- 自定義Button高亮狀態
- React Native自定義ButtonReact Native
- 自定義view————開關buttonView
- 如何自定義 drag 樣式
- mui toast自定義樣式UIAST
- 自定義 checkbox 樣式
- 自定義dialog樣式
- Qt Charts 自定義樣式QT
- Android 自定義Switch開關按鈕的樣式Android
- PHPCMS自定義表單樣式PHP
- Android 自定義Toast,修改Toast樣式和顯示時長AndroidAST
- Android設定選項開發及自定義Preference樣式Android
- CefSharp自定義捲軸樣式
- CSS自定義滑鼠指標樣式CSS指標
- ModernUI教程:如何從MUI樣式中派生自定義樣式UI
- checkbox/radio自定義樣式
- pixi.js 自定義游標樣式JS
- input[type="radio"]自定義樣式
- jQuery validate 自定義樣式、規則jQuery
- Flex SDK 4(Gumbo)更方便的自定義樣式、自定義SparkSkin(二)薦FlexSpark
- SQLserver自定義樣式主鍵-函式實現篇SQLServer函式
- 「HTML+CSS」--自定義按鈕樣式【004】HTMLCSS
- 「HTML+CSS」--自定義按鈕樣式【003】HTMLCSS
- 自定義Toast樣式+改變Toast寬高AST
- antd-mobile 自定義picker按鈕樣式
- 自定義瀏覽器滾動條樣式瀏覽器
- 自定義checkbox樣式(相容IE9)IE9
- [HTML/CSS]uploadify自定義按鈕樣式HTMLCSS
- Asp.Net2.0實現自定義樣式ASP.NET
- QFileDialog自定義樣式設定SetStytlesheet
- 「HTML+CSS」--自定義按鈕樣式【001】HTMLCSS
- 「HTML+CSS」--自定義按鈕樣式【002】HTMLCSS
- 微信小程式--自定義radio元件樣式微信小程式元件