Drawable 一般通过XML来定义,常被用来作为View 的背景使用。
Drawable 种类:
1. BitmapDrawable
它就表示一张图片
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_launcher_background"
android:antialias="true"
android:dither="true"
android:gravity="center"
android:mipMap="false"
android:tileMode="disabled"
android:filter="true">
</bitmap>
android:src 图片资源;
android:antialias 是否开启图片抗锯齿;
android:dither 是否开启抖动效果。当图片的像素和手机屏幕的像素匹配不一直时,开启可以让高质量的图片在低质量的屏幕上保持较好的效果;
android:gravity 当图片小于容器尺寸时,可以对图片进行定位;
android:mipMap 纹理映射,默认false,在日常开发中不常用;
android:tileMode 平铺模式,开启平铺模式后 gravity 属性会被忽略;
android:filter 是否开启过滤效果,当图片被拉伸或压缩时,开启可以保持较好的显示效果;
2.ShapeDrawable
通过颜色来构造的图形,它既可以是纯色也可以是渐变效果;
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<corners
android:radius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="5dp"
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"/>
<gradient
android:angle="5dp"
android:centerX="5dp"
android:centerY="5dp"
android:centerColor="@color/colorAccent"
android:startColor="@color/colorAccent"
android:endColor="@color/colorAccent"
android:gradientRadius="5dp"
android:type="linear"
android:useLevel="true"
/>
<padding
/>
<size
android:width="5dp"
android:height="5dp"
/>
<solid
android:color="@color/colorAccent"
/>
<stroke
android:width="5dp"
android:color="@color/colorAccent"
android:dashWidth="5dp"
android:dashGap="5dp"
/>
</shape>
android:shape 表示图形形状,rectangle(矩形)、oval(椭圆)、line(横线)、ring(圆环)
<corners/> 表示shape的四个角度,它只适用于矩形shape;
android:radius 四个角同时设为相同角度,优先级较低,会被其他四个属性覆盖;
android:topLeftRadius 左上角;
android:topRightRadius 右上角;
android:bottomLeftRadius 左下角;
android:bottomRightRadius 右下角;
<gradient/> 与 <solid/> 互相排斥,solid表示纯色填充,gradient表示渐变效果;
android:angle 渐变的角度,默认为0,其值必须为45的倍数,0表示从左到右,90表示从上到下;
android:centerX 渐变中心点的横坐标;
android:centerY 渐变中心点的纵坐标 ;
android:startColor 渐变的起始色;
android:centerColor 渐变的中间色;
android:endColor 渐变的结束色;
android:gradientRadius 渐变半径,仅当android:type="radial"时有效;
android:type 渐变的类型,linear(线性渐变)、radial(径向渐变)、sweep(扫描线渐变)
android:useLevel 一般为false,当Drawable作为StateDrawable使用时为true;
<solid/> 纯色填充,通过android:color设置颜色;
<stroke/> shape的描边;
android:width 描边的宽;
android:color 描边颜色;
android:dashWidth 组成虚线的线段宽;
android:dashGap 组成虚线的线段之间的间隔;
<size/> 表示shape的大小;
3.LayerDrawable
LayerDrawable 对应 <layer-list> 标签,他表示一种层次化的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:id="@+id/test"
android:top="5dp"
android:right="5dp"
android:left="5dp"
android:bottom="5dp"/>
</layer-list>
一个<layer-list>可以包含多个item,每个item表示一个Drawable,item常用的属性分别表示Drawable相对View的距离,layer-list有层次的概念,下面的item会覆盖上面的item;
4.StateListDrawable
StateListDrawable 对应 <selector> 标签,他也表示Drawable的集合,每个Drawable都对应这View的一种状态,主要用于设置可单击的View背景;
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize="true"
android:dither="true"
android:variablePadding="true"
>
<item
android:state_pressed="true"
android:state_focused="true"
android:state_selected="true"
android:state_checked="true"
android:state_enabled="true"/>
</selector>
android:constantSize true表示StateListDrawable的固有大小保持不变,false表示StateListDrawable会随状态改变而改变,默认为false;
android:dither 是否开启抖动;
android:variablePadding StateListDrawable的padding是否随状态而改变,true 会、false不会,默认false;
常见状态:pressed(按下未松开)、focused(View已焦点)、selected(选择了View)
5.LevelListDrawable
LevelListDrawable 对应 <level-list> 标签,同样表示Drawable的集合,集合中每个Drawable 都有一个level,根据不同level,LevelListDrawable 会切换对应的Drawable;
<?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="4"
android:minLevel="1"/>
</level-list>
每个item表示一个Drawable,并有对应的等级范围,当它作为View背景时,可以通过Drawable的setLevel方法设置不同等级所切换的Drawable,Drawable的等级范围:0~10000,默认为0;
6.TransitionDrawable
TransitionDrawable 对应 <transition>标签,用于实现两个Drawable间的淡入淡出效果(动画过度)
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/ic_launcher_background"
android:id="@+id/test"
android:top="5dp"
android:right="5dp"
android:left="5dp"
android:bottom="5dp"/>
</transition>
将TransitionDrawable 设置为View的背景,通过它的startTransition 和reverseTransition 方法来实现淡入淡出;
TransitionDrawable drawable = (TransitionDrawable)TextView.getBackground();
drawable.startTransition(1000);
7.InsetDrawable
InsetDrawable 对应 <inset>,它可以将其他的Drawable内嵌到自己当中,并留出一定距离;
<?xml version="1.0" encoding="utf-8"?>
<inset
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_launcher_background"
android:insetTop="5dp"
android:insetRight="5dp"
android:insetLeft="5dp"
android:insetBottom="5dp">
</inset>
8.ScaleDrawable
ScaleDrawable对应 <scale> 标签,可以将指定的Drawable 缩放一定比例;
<?xml version="1.0" encoding="utf-8"?>
<scale
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_launcher_background"
android:scaleGravity="center"
android:scaleHeight="25%"
android:scaleWidth="25%"
>
</scale>
android:scaleGravity 与shape中 android:gravity 相同;
android:scaleHeight 与 android:scaleWidth 指定Drawable 高和宽缩放的比例 如:50%;
9.ClipDrawable
ClipDrawable 对应 <clip> 标签,可以用来裁剪Drawable;
<?xml version="1.0" encoding="utf-8"?>
<clip
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_launcher_background"
android:clipOrientation="horizontal"
android:gravity="center"
>
</clip>
android:clipOrientation 裁剪方向(水平/竖直)
android:gravity 在容器中放置的位置;