在Android中Button是一个非常常用的控件,下面我们就一起来剖析一下Button的原理。
1 Button.java
原本以为Button是一个非常复杂的控件,所以它的源码也应该非常复杂,但是看到Button.java的代码之后我震惊了,代码如此的简单:
public class Button extends TextView {
publicButton(Context context) {
this(context, null);
}
publicButton(Context context, AttributeSet attrs)
{
this(context, attrs,
com.android.internal.R.attr.buttonStyle);
}
publicButton(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
}
这就是Button.java中除去打包和引用及注释代码之后的全部代码。可以看到Button是继承自TextView的,然后为其添加了一个默认的com.android.internal.R.attr.buttonStyle样式。下面我们就来看看这个默认的样式。
2 styles.xml
在android源码的styles.xml文件中我们找到了所有关于Button的样式:
name="android:background">@android:drawable/btn_default
name="android:focusable">true
name="android:clickable">true
name="android:textAppearance">?android:attr/textAppearanceSmallInverse
name="android:textColor">@android:color/primary_text_light
name="android:gravity">center_vertical|center_horizontal
name="android:background">@android:drawable/btn_default_small
name="android:background">@android:drawable/button_inset
name="android:background">@android:drawable/btn_default_transparent
name="android:textAppearance">?android:attr/textAppearanceSmall
name="android:textColor">@android:color/white
这里我们能看到button真正的各种获取焦点、被按下的各种样式都是由btn_default、btn_default_small、button_inset、btn_default_transparent这几个xml文件来控制的,那我们就接着来看其中的btn_default.xml文件看看其中有什么玄机
3 btn_default.xml
xmlns:android="http://schemas.android.com/apk/res/android">
android:state_enabled="true"
android:drawable="@drawable/btn_default_normal"
/>
android:state_enabled="false"
android:drawable="@drawable/btn_default_normal_disable"
/>
android:drawable="@drawable/btn_default_pressed"
/>
android:state_enabled="true"
android:drawable="@drawable/btn_default_selected"
/>
android:drawable="@drawable/btn_default_normal"
/>
android:drawable="@drawable/btn_default_normal_disable_focused"
/>
android:drawable="@drawable/btn_default_normal_disable"
/>
上面就是里面的所有的内容,它定义了Button各种状态下用到的图片。所以如果我们想自定义一个Button的样式的话我们只需要仿着这个文件来写Button的样式就行了。