网上实现自定义Button样式的方法有多种,有的自己重写CustomButton类,继承TextView,你可以查看Button.java(http://code.google.com/p/droiddraw/source/browse/trunk/DroidDraw/src/org/droiddraw/widget/Button.java?r=141)及相应的文章,这样做个人认为有点麻烦,本篇参照网上一篇英文文章(

http://blog.androgames.net/40/custom-button-style-and-theme/),下面是我的步骤:

1.首先我们需要三张按钮不同状态下的自定义外观的图片,为了在不同的分辨率下自动缩放,需要NinePatch drawables格式的文件,具体就是xx.9.png格式的图片,具体,需要用Android SDK中Tools文件夹中draw9patch.bat工具来生成这一部分的知识,请查看http://saberhaha.javaeye.com/blog/564392http://www.developer.com/ws/other/article.php/3889086/Working-with-NinePatch-Stretchable-Graphics-in-Android.htm等。

(注:以前不知道这一点,还闹个笑话,在Timers4Me中自定义TimePicker控件的时候,下载了相应的源码和资源,看到它的图片,我还很纳闷,为什么最后多了个.9,并且图片还有几条黑线几个点,还特意让美工对图片做了处理,将多余的部分去掉。)

本例中,用到以下图片:

* 按钮可以点击,但处于没有点击状态下的黑色XX.9格式背景图片

* 按钮可以点击,被点击下的状态的橙色的XX.9格式背景图片

* 按钮不可用状态下的XX.9格式的背景图片

上面的三张图片,需要放到项目中/res/drawables高中低密度中任何一个文件夹下

2.下面我们需要定义按钮处于不同状态下的样式:在/res/drawables/目录下高中低任何一个文件夹下,新建xml文件,名字可以自己取,这里我命名为custom_button.xml,在不同的状态下会引用相应的图片:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
  3.      
  4.     <item android:state_enabled="false" android:drawable="@drawable/btn_background_red" /> 
  5.     <item android:state_pressed="true" android:state_enabled="true" 
  6.         android:drawable="@drawable/btn_background_orange" /> 
  7.     <item android:state_focused="true" android:state_enabled="true" 
  8.         android:drawable="@drawable/btn_background_orange" /> 
  9.     <item android:state_enabled="true" android:drawable="@drawable/btn_background_black" /> 
  10. </selector> 

这里定义还是要按照规定的顺序来的,如果把最后一项放到第一条,那么只要按钮可用状态下,第一条条件成立,下面的就不会执行了。

3.另外还需要在/res/values/中新建一个xml文件,名称为styles.xml,这里定义了按钮的文本样式及不同状态下的样式:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.     <style name="CustomButton" parent="@android:style/Widget.Button"> 
  4.         <!-- 水平、垂直居中 --> 
  5.         <item name="android:gravity">center_vertical|center_horizontal</item> 
  6.         <!-- 字体颜色 --> 
  7.         <item name="android:textColor">#FFFFFFFF</item> 
  8.         <!-- 指定文本阴影的颜色,需要与shadowRadius一起使用 --> 
  9.         <item name="android:shadowColor">#FF000000</item> 
  10.         <!-- 设置阴影横向坐标开始的位置 --> 
  11.         <item name="android:shadowDx">0</item> 
  12.         <!-- 设置阴影纵向坐标开始的位置 --> 
  13.         <item name="android:shadowDy">-1</item> 
  14.         <!-- 设置阴影的半径,设置为0.1就变成文本的颜色了 --> 
  15.         <item name="android:shadowRadius">0.2</item> 
  16.         <item name="android:textSize">16sp</item> 
  17.         <item name="android:textStyle">bold</item> 
  18.         <!-- 这里引用定义的按钮样式 --> 
  19.         <item name="android:background">@drawable/custom_button</item> 
  20.         <item name="android:focusable">true</item> 
  21.         <item name="android:clickable">true</item> 
  22.     </style> 
  23. </resources> 

4.这里使用了theme,这种定义可以是程序中所有的按钮都是这样的外观,当然了,在实际项目中,不大可能会有这样的需求,只是体会这样使用方式而已,在/res/values/目录中新建xml文件,命名为themes.xml文件:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.     <!-- 自定义主题:没有标题栏,规定按钮的样式为CustomButton中定义的 --> 
  4.     <style name="CustomTheme" parent="android:style/Theme.NoTitleBar"> 
  5.         <item name="android:buttonStyle">@style/CustomButton</item> 
  6.     </style> 
  7. </resources> 

5.对主题的定义,需要在AndroidManifest.xml的application节点中引用相应的主题,由于主题中规定了按钮的样式,因此所有的按钮都自然成了定义的外观。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     package="com.mobileares.widget.custombutton" android:versionCode="1" 
  4.     android:versionName="1.0"> 
  5.     <uses-sdk android:minSdkVersion="4" /> 
  6.     <!-- 使用主题 --> 
  7.     <application android:icon="@drawable/icon" android:label="@string/app_name" 
  8.         android:theme="@style/CustomTheme"> 
  9.         <activity android:name=".CustomButton" android:label="@string/app_name"> 
  10.             <intent-filter> 
  11.                 <action android:name="android.intent.action.MAIN" /> 
  12.                 <category android:name="android.intent.category.LAUNCHER" /> 
  13.             </intent-filter> 
  14.         </activity> 
  15.  
  16.     </application> 
  17. </manifest> 

程序运行起来的截图如下,你可以点击一下看看效果,实际上可以用ImageButton,引用android:src或者android:background="@style/CustomButton"来设置,附件中是源码,有不对的地方,欢迎拍砖指正。