第六章、android的Drawable

  1. Drawable 简介
    Drawable有很多种,它们都表示一中图像的概念,但是它们又不全是图片,通过颜色也可以构造出各式各样的图像效果。在实际开发中,Drawable常用来作为View的背景使用。Drawable一般都是通过XML来定义的,我们也可用通过代码来创建具体的Drawable对象。
  2. Drawable的分类
  1. BitmapDrawable 、NinePatchDrawable
    代码如下:
<?xml version="1.0" encoding="utf-8"?>
<bitmap / nine-patch
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:antialias=["true" | "false"]
    android:dither=["true" | "false"]
    android:filter=["true" | "false"]
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                      "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                      "center" | "fill" | "clip_vertical" | "clip_horizontal"]
    android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
  1. 各个属性的含义:
  1. android:antialias:是否开启图片抗锯齿功能。开启后会让图片变得平滑,同时也会在一定程度上降低图片清晰度,但是降低幅度可以忽略不计,因此抗锯齿选项应该开启。
  2. android:dither: 是否开启抖动效果。当图片的像素配置和手机屏幕配置不一致时,开启这个选项可以让高质量的图片在低质量上还能保证较好的显示效果。抖动效果应该开启。
  3. android:filter:是否开启过滤效果。当图片尺寸被拉伸或者压缩时,开启过滤效果可以保证较好的显示效果。因此此选项也应该开启。
  4. 平铺模式,有四种选项[“disabled” | “clamp” | “repeat” | “mirror”]。当开启平铺模式后,gravity属性会被忽略。repeat是指水平和竖直方向上的平铺效果;mirror是指在水平和竖直方向上的镜面投影效果;clamp是指图片四周的像素会扩展到周围区域,这个比较特别。
  1. ShapeDrawable
    ShapeDrawable是一种常见的Drawable,可以理解通过颜色来构造图形,它即可以是纯色图形,也可以是具有渐变效果的图形。
    代码如下:
<shape    
xmlns:android="http://schemas.android.com/apk/res/android"    
android:shape=["rectangle" | "oval" | "line" | "ring"] >    
<corners        //当shape为rectangle时使用
    android:radius="integer"        //半径值会被后面的单个半径属性覆盖,默认为1dp
    android:topLeftRadius="integer"        
    android:topRightRadius="integer"        
    android:bottomLeftRadius="integer"        
    android:bottomRightRadius="integer" />    
<gradient       //渐变
    android:angle="integer"        
    android:centerX="integer"        
    android:centerY="integer"        
    android:centerColor="integer"        
    android:endColor="color"        
    android:gradientRadius="integer"        
    android:startColor="color"        
    android:type=["linear" | "radial" | "sweep"]        
    android:useLevel=["true" | "false"] />    
<padding        //内边距
    android:left="integer"        
    android:top="integer"        
    android:right="integer"        
    android:bottom="integer" />    
<size           //指定大小,一般用在imageview配合scaleType属性使用
    android:width="integer"        
    android:height="integer" />    
<solid          //填充颜色
    android:color="color" />    
<stroke         //边框
    android:width="integer"        
    android:color="color"        
    android:dashWidth="integer"        
    android:dashGap="integer" />
  1. LayerDrawer
    LayerDrawer对应的XML标签是,它表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果。默认情况下,laywer-list中的所有的Drawable都会被缩放至View的大小。
  2. StateListDrawable
    StateListDrawable 对应于标签,它也是表示Drawable集合,每个Drawable都对应着View的一种状态,这样系统就会根据View的状态来选择合适的Drawable。StatelistDrawable主要用于设置可单击的View的背景。
  3. LevelListDrawable
    对应于标签,它同样表示一个Drawable集合,集合中的每个Drawable都有一个等级的概念。根据不同的等级,LevelListDrawable会切换为对应的Drawable。
  4. TransitionDrawable
    TransitionDrawable对应于标签,它用于实现两个Drawable之间的淡入淡出效果。
  5. InsetDrawable
    InsetDrawable对应于标签,它可以将其它Drawable内迁到自己当中,并可以在四周留出一定的间距。当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现。
  6. ScaleDrawable
    对应标签,它可以根据自己的等级将指定的Drawable缩放到一定的比例。
  7. ClipDrawable
    对应标签,它可以根据自己当前的等级来裁剪另一个Drawable,裁剪方向可以通过android:clicpOperatioin和android.gravity这两个属性来共同控制。等级越大,表示裁剪和区域越小,因此等级10000表示不裁剪,这个时候整个图片都可以完全显示出来;等级0表示裁剪全部区域,这个时候整个图片将不可见。
  1. 自定义Drawable
    通常我们没有必要去自定义Drawable,这是因为自定义的Drawable无法再XML中使用,这就降低了自定义Drawable的适用范围。某些特殊情况下我们的确想自定义Drawable,这也是可以的。