Drawable表示的是一种可以在Canvas上进行绘制的抽象的概念,它的种类很多,最常见的颜色和图片都可以是一个Drawable。
Drawable一般是通过xml定义,但是也可以通过代码创建具体的Drawabl对象.
Drawable的内部宽/高参数比较重要,通过 getIntrinsicWidth 和 getIntrinsicHeight 这两个犯法可以获取到它们,但是,不是所有的Drawable都有内部宽/高。比如图片形成的Drawable的内部宽高,就是图片的宽高,但是颜色形成的Drawable它就没有内部宽高的概念。
<?xml version="1.0" encoding="utf-8"?>
<bitmap android:src="@drawable/ic_check" android:antialias="true" android:dither="true" android:filter="true" android:gravity="center" android:tileMode="clamp" xmlns:android="http://schemas.android.com/apk/res/android" />
<nine-patch android:src="@drawable/ic_check" android:dither="true" xmlns:android="http://schemas.android.com/apk/res/android"/>
表示的是一张.9格式的图片
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="1dp" android:topLeftRadius="1dp" android:topRightRadius="1dp" android:bottomLeftRadius="1dp" android:bottomRightRadius="1dp" />
<gradient android:angle="10" android:centerX="1" android:centerY="1" android:centerColor="@color/divider_grey" android:endColor="@color/black_button" android:gradientRadius="1" android:startColor="@color/orange_button" android:type="linear" android:useLevel="true" />
<padding android:left="1dp" android:top="1dp" android:right="1dp" android:bottom="1dp"/>
<size android:width="20dp" android:height="20dp"/>
<solid android:color="@color/cardview_shadow_end_color"/>
<stroke android:width="1dp" android:color="@color/description_color" android:dashWidth="1dp" android:dashGap="1dp"/>
</shape>
shape:
- android:shape : 表示图形的形状,有四种选项 rectangle(矩形),oval(椭圆),line(直线),ring(圆环),默认为矩形,line和ring必须通过标签指定线的宽度和颜色
corners:用于表示shape的四个角的圆角的程度,用px表示
- android:radius : 为四个角同时设置形同的角度
- android:topLeftRadius : 左上角角度
- andorid: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:useLevel : 一般为false,当Drawable作为StateListDrawable时为true
- android:type : 渐变的类别,有 linear(线性渐变),radial(径向渐变),sweep(扫描线渐变)
solid: 纯色填充
:shape的描边
- android:width : 描边宽度
- android:color : 描边颜色
- android:dashWidth : 组成虚线的线段宽度
- android:dashGap : 组成虚线的线段之间的间隔
padding:空白
size :shape的大小,表示的是固有大小,但是不一定是最终显示大小
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_check" android:top="1dp" android:left="1dp" android:right="1dp" android:bottom="1dp"/>
</layer-list>
表示的是一种层次化的Drawable集合,通过不同的Drawable放置在不同的层面上从而达到一种叠加后的效果,一个layer-list中可以包含多个item,默认情况下layer-list中的所有Drawable都会缩放到View的大小
<?xml version="1.0" encoding="utf-8"?>
<selector android:constantSize="true" android:dither="true" android:variablePadding="true" xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/ic_check" android:state_pressed="true" android:state_focused="true" android:state_hovered="true" android:state_selected="true" android:state_checkable="true" android:state_checked="true" android:state_enabled="true" android:state_activated="true" android:state_window_focused="true" />
<item android:drawable="#ffaaff"/>
</selector>
对应于selector标签,它也是Drawable集合,每个item对应这view的一种状态,这样系统机会根据view的状态来选择Drawable,主要用于可单击的view背景,最常见的是button
系统会根据view的当前状态从selector中选择对应的item,每个itme对应着一个Drawable,系统从上至下匹配,直到找到第一个匹配的item,一般来说,默认的item应该放在selector的最后一条并且不附带任何状态
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_check" android:maxLevel="5" android:minLevel="1"></item>
</level-list>
LeverListDrawable表示一个Drawable集合,集合中的每个Drawable都有一个等级的概念,根据不同的等级,LeverListDrawable会切换对应的Drawable,可以通过Drawable的setLevel方法来设置不同的等级从而切换具体的Drawable
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_check" android:id="@+id/its" android:top="1dp" android:right="1dp" android:left="1dp" android:bottom="1dp"/>
<item android:drawable="#ffaacc"/>
</transition>
用于实现两个Drawable之间的淡入淡出效果,可以通过它的 startTransition,和reverseTransition来实现淡入淡出的效果以及它的逆过程
Button unlockButton=(Button)findViewById(R.id.unlock);
TransitionDrawable drawable=(TransitionDrawable)unlockButton.getBackground();
drawable.startTransition(1000);
InsetDrawable 对应于 inset 标签,它可以将其它的Drawable内嵌到自己当中,并可以在四周留出一段距离
ScaleDrawable 对应于 scale标签,它可以根据自己的等级将指定的Drawable缩放到一定比例
<?xml version="1.0" encoding="utf-8"?>
<scale android:drawable="@drawable/ic_check" android:scaleGravity="center" android:scaleHeight="25%" android:scaleWidth="25%" xmlns:android="http://schemas.android.com/apk/res/android" />
<?xml version="1.0" encoding="utf-8"?>
<clip android:drawable="@drawable/ic_check" android:clipOrientation="vertical" android:gravity="center" xmlns:android="http://schemas.android.com/apk/res/android" />
ClipDrawable 对应于标签clip,它可以根据自己当前的等级来裁剪Drawable,clipOrientation 表示裁剪方向
Button unlockButton=(Button)findViewById(R.id.unlock);
ClipDrawable drawable=(ClipDrawable)unlockButton.getBackground();
drawable.setLevel(1);
Drawable的等级有范围的,0~10000,最小等级是0,最大等级是10000,对于ClipDrawable来说,等级0表示完全裁剪,等级1000表示不裁剪