在程序开发中,android系统控件提供的外观往往距离我们要求的有一定差距,

此时我们可以通过一些方法来修改。

本文只讨论外观修改,在系统控件上进行功能扩充的自定义控件另外讨论。

首先我们看下系统的RadioButton:

RadioButton长成什么样子是由其Background、Button等属性决定的,Android系统

使用style定义了默认的属性,在android源码

android/frameworks/base/core/res/res/values/styles.xml中可以看到默认的定义:

Xml代码

@android:drawable/btn_radio_label_background
@android:drawable/btn_radio

即其背景图是btn_radio_label_background,其button的样子是btn_radio

btn_radio_label_background是什么?

其路径是android/frameworks/base/core/res/res/drawable-mdpi/btn_radio_label_background.9.png

可以看到是一个NinePatch图片,用来做背景,可以拉伸填充。

btn_radio是什么?

其路径是android/frameworks/base/core/res/res/drawable/btn_radio.xml

是个xml定义的drawable,打开看其内容:

Xml代码

android:drawable="@drawable/btn_radio_on" />
android:drawable="@drawable/btn_radio_off" />
android:drawable="@drawable/btn_radio_on_pressed" />
android:drawable="@drawable/btn_radio_off_pressed" />
android:drawable="@drawable/btn_radio_on_selected" />
android:drawable="@drawable/btn_radio_off_selected" />

定义了不同状态下radioButton长成什么样子。

如果不知道selector是什么,就要去看下Android SDK文档中Dev Guide->Application Resources->Resource Types。

以下面一个item为例:

android:drawable="@drawable/btn_radio_on_pressed" />

意思即为当radiobutton被选中时,并且被按下时,其Button应该长成btn_radio_on_pressed这个样子。

文件是android/frameworks/base/core/res/res/drawable-mdpi/btn_radio_on_pressed.png
drawable的item中可以有以下属性:
android:drawable="@[package:]drawable/drawable_resource"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_active=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_window_focused=["true" | "false"]

当按钮的状态和某个item匹配后,就会使用此item定义的drawable作为按钮图片。

从上面分析我们如果要修改RadioButton的外观,那么步骤应该是:

(1)制作一个9patch的图片作为背景图

准备一副PNG图片,其中白色为透明色,是否需要透明各人根据自己需要决定。

android 个性化控件 安卓控件样式_Android如何修改控件的外观

运行SDK/tools/draw9patch

在可伸缩的范围周围加上黑色的线告知系统这些区域可以伸缩。

制作完的图片,周围多了黑色线。

android 个性化控件 安卓控件样式_android 个性化控件_02

(2)针对不同的状态提供按钮图片

enabled, on: 紫色外框、红色中心点

android 个性化控件 安卓控件样式_Android如何修改控件的外观_03

enabled, off:只有紫色外框

android 个性化控件 安卓控件样式_Android如何修改控件的外观_04

enabled, on, pressed:黄色外框,红色中心点

android 个性化控件 安卓控件样式_xml_05

enabled, off, pressed:黄色外框

android 个性化控件 安卓控件样式_xml_06

disabled, on: 灰色外框、灰色中心点

android 个性化控件 安卓控件样式_sed_07

disabled, off: 灰色外框

android 个性化控件 安卓控件样式_Android如何修改控件的外观_08

其余的状态此处就不再定义。

(3)使用xml描述一个drawable

在res/drawable/创建custom_radio_btn.xml

Xml代码

android:drawable="@drawable/enabled_on_pressed" />
android:drawable="@drawable/enabled_off_pressed" />
android:drawable="@drawable/enabled_on" />
android:drawable="@drawable/enabled_off" />
android:drawable="@drawable/disabled_on" />
android:drawable="@drawable/disabled_off" />

Item顺序是有讲究的,条件限定越细致,则应该放到前面。比如这儿如果把1,2行和3,4行的item交换,那么pressed的就永远无法触发了,因为有item已经满足条件返回了。可以理解为代码中的if语句。

(4)创建一个自定义的style,并应用到RaidioButton的style属性上

Xml代码

@drawable/radio_btn_bg
@drawable/custom_radio_btn

运行ap即可看到此RadioButton的外观已经改变,此demo可以看到文字被按钮遮盖了一部分,

这儿是因第一步制作9patch图片时没有留出按钮图片空间来,稍作修改即可。

android 个性化控件 安卓控件样式_sed_09

详细代码请参加最后一个附件。