Drawable表示一种可以在canvas上进行绘制的抽象概念。

Drawable优点:1.使用简单,比自定义view成本低。

                          2.非图片类的Drawable占用体积小,这对减少apk有很大作用。

Drawable分类:Drawable的种类繁多,本章介绍如下分类,BitmapDrawable、NinePatchDrawable、ShapeDrawable、LayerDrawable、StatelistDrawable、LevelListDrawable、TransitionDrawable、InsetDrawable、ScaleDrawable、ClipDrawable。

1.BitmapDrawable:表示一张图片。

示例:

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://shechmas.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:mipmap=["true"|"false"]
//是否开启纹理映射,这是图像处理的相关技术
    android:titleMode=["disable"|"clamp"|"repeat"|"mirror"]
//平铺模式,当开启平铺模式时gravity不起作用
//disable 关闭平铺模式
//clamp   图片像素会扩展到周围
//repeat  水平和竖直向上的平铺效果
//mirror  水平和竖直向上的镜面效果

2.NinePatchDrawable:表示一张图片,但是也可以用.9图,属性和BitmapDrawable一致。

3.ShapeDrawable:用颜色来构建的图形。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    //shape表示图形的形状   rectangle矩形  oval椭圆  line横线  ring圆环  后面两个需要和<stroke>配合使用
    <corners android:radius="1dp"
        android:bottomLeftRadius="1dp"
        android:bottomRightRadius="1dp"
        android:topLeftRadius="1dp"
        android:topRightRadius="1dp"/>
    //表示四个角的角度    只适用于矩形shape
    <gradient android:angle="1dp"                            //渐变角度
        android:centerX="1dp"                                //渐变中心点横坐标
        android:centerY="1p"                                 //渐变中心点纵坐标
        android:startColor="@color/colorAccent"              //渐变起始色        
        android:centerColor="@color/colorAccent"             //渐变中间色
        android:endColor="@color/colorAccent"                //渐变结束色
        android:type="linear"                                //渐变类型 linear线性渐变  radial径向渐变  sweep扫描线渐变
        android:gradientRadius="1dp"                         //渐变半径  仅当为径向渐变时起作用
        android:useLevel="true"/>                            //一般为false,当与StateListDrawable一起使用为true
    //表示渐变效果
    <padding android:right="1dp"
        android:left="1dp"
        android:top="1dp"
        android:bottom="1dp"/>
    //表示空白,表示的是包含它的view的空白,不是shape的空白
    <size
        android:width="1dp"                //修改的是getIntrinsicWidth的值
        android:height="1dp"/>             //修改的是getIntrinsicHeight的值
    //表示宽高 但是当shape作为view的背景时,还是会被拉伸或者缩小到view的大小
    <solid android:color="@color/colorAccent"/>
    //表示填充色
    <stroke android:width="1dp"                        //描边宽度
        android:color="@color/colorAccent"             //描边颜色
        android:dashGap="1dp"                          //组成虚线的线段的宽度
        android:dashWidth="1dp"/>                      //组成虚线的线段的空隙
    //表示描边  注意:dashGap和dashWidth都要有值才能起作用
</shape>

4.LayerDrawable:表示一种层次化的Drawable的集合。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_launcher_background"
        android:top="1dp"
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp"/>
</layer-list>
//top bottom left right 表示相对view的偏移量    drawable表示图片资源,也可以在item内自定义Drawable

以下是一个输入框的示例:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item >
        <shape android:shape="rectangle">
            <solid android:color="#0ac39e"/>
        </shape>
    </item>
    <item android:bottom="6dp">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white"/>
        </shape>
    </item>
    <item android:right="1dp"
        android:left="1dp"
        android:bottom="1dp">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white"/>
        </shape>
    </item>
</layer-list>

5.StateListDrawable:表示Drawable的集合,对应的是<selector>标签。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize="true"                //StateListDrawable的固有大小是否随其状态改变而改变
    android:dither="true"                      //是否开启抖动
    android:variablePadding="true">            //表示StateListDrawable的padding是否随状态改变
    <item android:drawable="@drawable/ic_launcher_background"
        android:state_pressed="true"           //表示按下状态,比如Botton被按下后没有松开的状态
        android:state_focused="true"           //表示view已经获取到焦点
        android:state_hovered="true"           
        android:state_selected="true"          //表示用户选择了view
        android:state_checkable="true"         //表示用户选中了view,一般适用于checkBox这类
        android:state_checked="true"
        android:state_enabled="true"           //表示view处于可用状态
        android:state_activated="true"
        android:state_window_focused="true"/>
</selector>

6.LevelListDrawable:表示一个Drawable的集合,集合中每个Drawable都有一个等级(level)的概念,对应标签<level_list>

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_launcher_background"
        android:maxLevel="2"            //最大值  最大10000
        android:minLevel="1"/>          //最小值  最小0
</level-list>
//最大值最小值之间的等级会对应此item中的Drawable。可以通过设置等级切换当前view的背景(setLevel)或者前景(setImageLevel)

7.TransitionDrawable实现两个Drawable之间的淡入淡出操作,对应<transition>标签。

8.InsetDrawable将其他的Drawable内嵌到自己当中,并且可以在四周流出一定间距。对应<inset>标签。

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_launcher_background"
    android:inset="1dp"                //内嵌边距
    android:insetBottom="1dp"
    android:insetLeft="1dp"
    android:insetRight="1dp"
    android:insetTop="1dp">
</inset>

9.ScaleDrawable:根据自己的等级(level)将指定的Drawable缩放到一定比例,对应<scale>标签。

10.ClipDrawable根据自己的等级来裁剪另一个Drawable,对应于<clip>标签。