Drawable资源代表着那些可以绘制在屏幕上,而且可以通过API方法getDrawable(int)获取到的图像资源,或者通过android:drawable属性或android:icon属性被其它XML资源引用的图像资源。Drawable资源有下面几种不同的类型:

【1】Bitmap File(图片资源)

位图文件。如后缀名为.png.jpg, or .gif。我们可以通过去BitmapDrawable创建。

【2】Nine-Patch File(.9图片资源)

.9图片拥有一个可伸缩的区域,允许基于图片内容去改变图片的大小。可以通过NinePatchDrawable类去创建。

【3】Layer List(drawable层次资源)

它可以管理一组Drawable资源。它们的绘制顺序就是在组中的出现顺序,最先出现的会最先绘制,最后出现的会最后绘制在屏幕的最上层。可以通过LayerDrawable类去创建。

【4】State List(状态列表资源)

它是一个根据不同状态对应不同Drawable资源的XML文件(比如说,一个按钮按下去和普通状态展示不同的drawable资源)。可以通过StateListDrawable类去创建。

【5】Level List(阶段列表资源)

它定义了Drawable资源,这个Drawable资源管理了许多的候选Drawable资源都通过android:maxLevel属性分配有一个一个整数。可以通过LevelListDrawable类去创建。

【6】Transition Drawable(过渡Drawable资源)

它是一种允许在两张Drawable资源间淡入淡出的Drawable XML资源。可以通过TransitionDrawable类去创建。

【7】Inset Drawable(嵌入Drawable资源)

它是一种可以通过指定一些内嵌边距将一个Drawable资源嵌入到另外一个Drawable中的资源。比如当一个View需要一个比它实际边界要小的背景资源时,这个嵌入资源非常有用。可以通过InsetDrawable类去创建。

【8】Clip Drawable(裁剪Drawable资源)

它允许你根据当前的Drawable资源层去裁剪另外一个Drawable资源。可以通过ClipDrawable类去创建。

【9】Scale Drawable(缩放Drawable资源)

它允许你根据当前的Drawable资源层去缩放另外一个Drawable资源。可以通过ScaleDrawable类去创建。

【10】Shape Drawable(形状Drawable资源)

它是一种几何图像的Drawable资源,包含有颜色和渐变。可以通过ShapeDrawable类去创建。

【11】AnimationDrawable(动画Drawable资源)

这个在从零学Android(七)、Android资源类型之动画资源中学习逐帧动画时有学习过,不再赘述。

特别注意:颜色资源在XML文件中也能作为Drawable资源使用。比如,我们创建一个State List资源时,我们可以这么去指定它的android:drawable属性:android:drawable="@color/green"


下面分别来学习这些Drawable资源:

1. Bitmap File(图片资源)

Android支持三种位图资源,它们的后缀名分别为.png(最好使用这种格式的图片),.jpg(这种格式只能算可以接受),.gif(官方不鼓励使用GIF图)。当然,我们也可以直接去引用一个XML位图资源文件,用文件名作为它的资源ID,或者创建一个别名资源。

注意:在项目的构建过程中,我们的位图文件可能会被aapt工具(Android Asset Packaging Tool)进行无损压缩。比如说,一个不需要使用256色的true-color的png图片,可能会通过颜色调色板被转换成一个8位的png图片。这样,相同质量的图片资源只需要占用更少的内存。所以放置在这个目录下的图片二进制资源可能在项目的构建过程发生改变。如果你希望使用二进制流去读取图片资源,然后转换成Bitmap的话,你需要将你的图片资源放入到res/raw/这个目录下,因为这个目录下的资源不会被优化。


1.1 Bitmap文件

Bitmap文件就是指.png,.jpg,.gif的文件。当我们把这类图片资源放入到res/drawable/目录下时,Android都是通过Drawable去创建它们。

文件位置:res/drawable/filename.png (.png.jpg, or .gif)

文件名将作为它们的资源ID。

编译后的数据类型为:BitmapDrawable。

资源的引用方式:

在Java文件中:R.drawable.filename

在XML文件中:@[package:]drawable/filename


1.2 Bitmap XML文件

Bitmap XML是一种在XML资源文件中指向一个Bitmap文件的资源。它的作用是给原始的Bitmap文件一个别名,而且XML可以在这个Bitmap文件的基础之上指定一些如抖动,平铺的其它属性。

文件位置:res/drawable/filename.xml

文件名将作为它们的资源ID。

编译后的数据类型为:BitmapDrawable。

资源的引用方式:

在Java文件中:R.drawable.filename

在XML文件中:@[package:]drawable/filename

语法:
<?xml version="1.0" encoding="utf-8"?>
分析元素标签:

【1】根元素

表示这是一个Bitmap资源文件。

属性:

xmlns:android属性:XML文件的名称空间。其值必须为:"http://schemas.android.com/apk/res/android"。只有当作为根元素时候才是必须的字段。如果被嵌套在一个元素中就不需要这个属性。

android:src属性:取值为Drawable资源。指向的Bitmap资源。必须属性。

android:antialias属性:取值为Boolean。启用或者 禁用抗锯齿。

android:dither属性:取值为Boolean。启用或者禁用位图抖动功能(当前的位图和当前屏幕的像素配置不相同时抖动,比如在RGB 565的屏幕上显示一个ARGB 8888的图片资源)。

android:filter属性:取值为Boolean。启用或者禁用过滤器功能。过滤器功能被用于当图片被拉伸或者压缩时圆滑过渡。

android:gravity属性:这个属性很重要。它定义了当图片资源的大小小于容器大小时,图片在容器中的位置。它的取值必须是如下值中的一个或者多个,多个时用“|”分隔:

1、top:将Bitmap放置在容器的上方,不改变Bitmap的大小。

2、bottom:将Bitmap放置在容器的下方,不改变Bitmap的大小。

3、left:将Bitmap放置在容器的左边界,不改变Bitmap的大小。

4、right:将Bitmap放置在容器的右边界,不改变Bitmap的大小。

5、center_vertical:将Bitmap放置在容器的垂直方向的中间位置,不改变Bitmap的大小。

6、fill_vertical:如果需要的话,将Bitmap沿垂直方向拉伸,以便完全填充容器垂直方向。

7、center_horizontal:将Bitmap放置在容器的水平方向的中间位置,不改变Bitmap的大小。

8、fill_horizontal:如果需要的话,将Bitmap沿水平方向拉伸,以便完全填充容器垂直方向。

9、center:将Bitmap放置在容器的中间位置,不改变Bitmap的大小。

10、fill:如果需要的话,将Bitmap拉伸,以便完全填充容器内容大小。

11、clip_vertical:这个是附加的选项,它可以用于设置当你有使用top 和/或bottom 取值时,如果Bitmap的大小超出了容器的垂直方向边界,那么可以裁剪掉这个Bitmap。这个裁剪的行为基于垂直方向,即当你设置有top取值时,会裁剪下方边界超出的部分;当你设置有bottom 取值时,会裁剪上方边界超出的部分,或者两个都不裁剪。

12、clip_horizontal:这个是附加的选项,它可以用于设置当你有使用 left和/或 right取值时,如果Bitmap的大小超出了容器的水平方向边界,那么可以裁剪掉这个Bitmap。这个裁剪的行为基于垂直方向,即当你设置有left取值时,会裁剪右侧边界超出的部分;当你设置有right取值时,会裁剪左侧边界超出的部分,或者两个都不裁剪。

13、start:将Bitmap放在容器的开始位置。不改变其大小

14、end:将Bitmap放在在容器的结束位置。不改变其大小

(PS:关于11、clip_vertical和 12、clip_horizontal在Demo中的效果和预期不一致的问题,有知道的大神帮忙留个言讲解下,不胜感激!)

android:mipMap属性:取值为Boolean。代表着是否希望渲染器采用纹理映射。默认值为false。

android:tileMode属性:这个属性很重要。它定义了Bitmap填充容器的方式。当这个属性被启用时,android:gravity属性会被忽略掉,同时Bitmap会被反复放置在容器中。它的取值必须为下面几种:

1、disabled:禁用android:tileMode属性,这个是默认值。

2、clamp:使用Bitmap边缘色彩填充容器。

3、repeat:在水平和垂直方向上重复平铺Bitmap。

4、mirror:在水平和垂直方向上重复平铺Bitmap,交替的镜像Bitmap使得相邻的Bitmap总是看起来方向相反。    


2. Nine-Patch File(.9图片资源)

文件位置:res/drawable/filename.xml

其中文件名将作为资源ID使用。

编译后的资源对应的数据类为:NinePatchDrawable

资源引用方式:

在Java文件中:R.drawable.filename

在XML中:@[package:]drawable/filename

语法:

<?xml version="1.0" encoding="utf-8"?>
这里需要注意的是src属性对应的图片资源必须是.9类型的图片。否则会报运行时异常。


3. Layer List(drawable层次资源)

LayerDrawable管理着一组drawable对象,然后每一个drawable会按顺序绘制在屏幕上,最后出现的drawable会出现在最上面。

文件位置:res/drawable/filename.xml

编译后的类型:LayerDrawable

资源引用方式:

在Java文件中:R.drawable.filename

在XML中:@[package:]drawable/filename

语法:

<?xml version="1.0" encoding="utf-8"?>    
具体的使用参考末尾的Demo。


4.State List(状态列表资源)

StateListDrawable定义了在不同状态下,显示不同的drawable资源。比如一个按钮Button在不同的状态下(普通状态,按下状态,获得焦点状态等),显示不同的背景。它在XML中的定义时,根元素必须是,其下可以包含多个,每个都可以对应一种或者多种状态,值得注意的是,状态改变时,状态列表会从上至下遍历选择当前一个符合条件的,而不会采用“最佳匹配”的那一个,比如说,按下按钮触发了focus和pressed状态,而只要有某一个满足其中的某个状态,就会选用这个,而不会选择同时满足这个两个状态的

文件位置:res/drawable/filename.xml

编译后的类型:StateListDrawable

资源引用方式:

在Java文件中:R.drawable.filename

在XML中:@[package:]drawable/filename

语法:

<?xml version="1.0" encoding="utf-8"?>    
注意:android:drawable属性可以取color颜色值,不过这个color颜色值必须定义在colors.xml中,而不能直接通过16进制数字去表示。

例子:编写文件res/drawable/button.xml

<?xml version="1.0" encoding="utf-8"?>                    
然后在XML文件中使用:

5.Level List(阶段列表资源)

LevelListDrawable资源同样管理了一组drawable资源,并且可以给这些drawable资源设定一个minlevel和maxlevel来表示这个资源的适用level。可以通过setLevel()去设置当前LevelListDrawable资源的level值,以便去选择其下合适的drawable,如果其下没有满足当前level值的drawable,相当于这个资源无效。具体用法和注意点,参考最末尾的Demo。

文件位置:res/drawable/filename.xml

编译后的类型:LevelListDrawable

资源引用方式:

在Java文件中:R.drawable.filename

在XML中:@[package:]drawable/filename

语法:
<?xml version="1.0" encoding="utf-8"?>    
例子:
<?xml version="1.0" encoding="utf-8"?>        
当这个资源被应用到一个View上时,我们可以使用Drawable类的 setLevel()或者ImageView类的 setImageLevel()方法去修改当前 LevelListDrawable的level值。

6.Transition Drawable(过渡Drawable资源)

TransitionDrawable资源是一种使用两个Drawable资源来进行过渡转换的资源。我们可以通过在XML文件中使用一个标签包含两个标签来定义TransitionDrawable资源。注意,如果少于两个标签,在引用该资源时,会报运行时异常,而如果你添加超过两个标签,那么从第三个开始(包含第三个),后面所有的标签都是无效的。我们可以通过startTransition()去开始过渡转换动作,通过reverseTransition()反向过渡到上一个Drawable资源显示。

文件位置:res/drawable/filename.xml

编译后的类型:TransitionDrawable

资源引用方式:

在Java文件中:R.drawable.filename

在XML中:@[package:]drawable/filename

语法:
<?xml version="1.0" encoding="utf-8"?>    
具体例子参考末尾Demo。


7.Inset Drawable(嵌入Drawable资源)

InsetDrawable资源可以指定我们Drawable资源距离使用资源的View的边界的距离。当我们的View需要一个比View大小要小的资源背景的时候,这个资源非常有用。这一点是View的padding属性做不到的(具体效果对比参考Demo)。值得注意的是,在设置边距的时候,必须通过android:insetTop、android:insetRight、android:insetBottom、android:insetLeft去指定,而不能直接android:inset去代替这四个属性值。

文件位置:res/drawable/filename.xml

编译后的类型:LevelListDrawable

资源引用方式:

在Java文件中:R.drawable.filename

在XML中:@[package:]drawable/filename

语法:
<?xml version="1.0" encoding="utf-8"?>


8.Clip Drawable(裁剪Drawable资源)

ClipDrawable可以对我们指定的Drawable进行裁剪。我可以通过level来控制裁剪的量,通过android:clipOrientation来控制裁剪方向,然后通过gravity控制裁剪的位置。(具体用法参考Demo)

文件位置:res/drawable/filename.xml

编译后的类型:ClipDrawable

资源引用方式:

在Java文件中:R.drawable.filename

在XML中:@[package:]drawable/filename

语法:
<?xml version="1.0" encoding="utf-8"?>

9.Scale Drawable(缩放Drawable资源)

ScaleDrawable可以对我们指定的Drawable进行缩放

文件位置:res/drawable/filename.xml

编译后的类型:ScaleDrawable

资源引用方式:

在Java文件中:R.drawable.filename

在XML中:@[package:]drawable/filename

语法:
<?xml version="1.0" encoding="utf-8"?>

10.Shape Drawable(形状Drawable资源)

GradientDrawable用来定义几何图形资源。

文件位置:res/drawable/filename.xml

编译后的类型:GradientDrawable

资源引用方式:

在Java文件中:R.drawable.filename

在XML中:@[package:]drawable/filename

语法:
<?xml version="1.0" encoding="utf-8"?>                        
以上有两点需要我们注意:

【1】标签只适用于android:shape="rectangle"的情形。

【2】当我们去创建一个圆环shape资源时(即android:shape="ring"),我们需要设置标签的android:useLevel属性为false。否则圆环不会显示。具体参考Demo的使用代码。


Demo下载









更多相关文章

  1. Android学习(2)EditView属性
  2. android R.java资源文件不自动生成的原因
  3. Android 读取app内json配置文件
  4. Android Studio 学习笔记(一)环境搭建、文件目录等相关说明
  5. Android开发学习笔记:TextView的属性详解
  6. Android context 文件模式

随机推荐

  1. 为Android(安卓)Application指定版本
  2. Android核心分析 之三:手机之硬件形态
  3. Android 优化布局层次结构
  4. Android Market中产品图标设计原则
  5. Android 打包流程
  6. 《冰球撞击》Android休闲桌球类游戏现已
  7. 【贪吃蛇—Java程序员写Android游戏】系
  8. Android安全模型之介绍
  9. Android 数据库存储之db4o
  10. [置顶] Android(安卓)轻松实现仿QQ消息下