Android Drawable学习
在Android世界里,凡是要在屏幕上绘制的东西都可以叫做drawable,比如抽象图形、Drawable的子类、位图图像等。其可以通过APIs中的getDrawable(int)方法检索出来,也可以在其他的Android:drawable和android:icon等属性上使用它。
Android中有多种不同种类的drawable,比如有BitmapDrawable、NinePatchDrawable、LayerListDrawable、StateListDrawable等
一、state list drawable
state list 用于引用不同状态的位图图形(比如,当一个Button被按下时,其不同的状态显示的不同的图像)
例如:首先定义按钮按下时的shape drawable,创建一个button_pressed.xml文件。
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/red" />
</shape>
再定义一个按钮未按下的shape drawable,创建一个button_normal.xml文件。
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/blue" />
</shape>
接下来,要在按钮按下时,使用这个新建的shape drawable。所以我们需要用到state list drawable,然后根据按钮的状态,state list drawable可以切换指向不同的drawable。按钮没有按下的时候指向button_normal.xml,按下的时候指向button_pressed.xml。
然后在drawable目录中定义一个state list drawable,创建button_box.xml文件
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_pressed"
android:state_pressed="true"/>
<item android:drawable="@drawable/button_normal"
android:state_pressed="false"/>
</selector>
二、layer list drawable
Layer list 用来管理多个drawable的数组,而且数组里某个元素索引值越大,就将该元素画在越高的地方并生成一个layerDrawable对象。
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="@color/red"/>
</shape>
</item>
<item>
<shape android:shape="oval"
android:width="4dp">
<solid android:color="@color/red"/>
</shape>
</item>
</layer-list>
这样,layer list drawable中指定了两个drawable。第一个是红圆圈,第二个是绘在了第一个圆上,定义了一个4dp粗的深红圆圈。
三、Nine-Patch Drawable
有时候,按钮背景图必须用到普通图片,那么如果按钮需要以不同的尺寸显示,背景图该如何变化呢?
如果按钮的宽度大于背景图的宽度,图片就会被拉伸,这样效果不会很好。因为朝一个方向拉伸背景图可能会让图片失去原样,所以需要控制图片的拉伸方式。
这样就需要用到Nine-Patch解决问题。Nine-Patch图像是一种特别处理过的文件,当Android知道图像的哪些部分可以拉伸,哪些不可以。所以只要处理得当,就能确保背景图的边角与原始图像保持一致。
Nine-patch图像分成3X3的网格,即由9 patch组成的网络。这个网络角落部分不会被缩放,边缘部分的4个Patch只会按照一个维度缩放,而中间的部分按两个维度缩放,如下图所示:
可以使用Android SDK自带的draw9path工具来编辑Nine-patch图片
具体工具使用可参见http://www.xuebuyuan.com/2135684.html
该博客参考书籍《Android编程权威指南》