移动互联网,博客学习

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只会按照一个维度缩放,而中间的部分按两个维度缩放,如下图所示:

IMG_3343这里写图片描述

可以使用Android SDK自带的draw9path工具来编辑Nine-patch图片

具体工具使用可参见http://www.xuebuyuan.com/2135684.html

该博客参考书籍《Android编程权威指南》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值