Drawable表示一种可以在Canvas上进行绘制的抽象概念
一种图像的概念,一般用XML定义,也可以用代码定义
BitmapDrawable(重要)
<bitmap>标签
示例代码:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/icon_weixin"
android:antialias="true"
android:dither="true"
android:filter="true"
android:gravity="center"
android:mipMap="false"
android:tileMode="disabled"
>
</bitmap>
android:src图片资源ID
android:antialias是否开启图片抗齿距(让图片平滑但降低了清晰度)
android:dither是否开启抖动效果(让高质量图片在低质量屏幕上展现较好的效果)
android:filter是否开启过滤效果(图片拉伸或压缩时展现较好效果)
android:gravity定位
android:mipMap纹理映射
android:tileMode平铺模式
NinePatchDrawable
.9格式图片,用<nine_patch>标签表示
ShapeDrawable(重点)
通过颜色构造的图形,非常的常用,<shape>标签
示例代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--设置背景色-->
<solid android:color="#ffffff"/>
<!--设置圆角-->
<corners android:radius="2dp"/>
<!--设置边框线的宽度和颜色-->
<stroke android:width="1dp" android:color="#5454F0" />
</shape>
android:shape形状:rectangle矩形,oval椭圆,line线形,ring圆形
android:innerRadius圆环内半径android:thickness圆环厚度
<corners>圆角
<gradient>渐变颜色填充
<solid>纯色填充
<stroke>描边
<padding>包含它的view的空白
<size>固有宽高,但不是最终显示,使用时还是会被拉伸或缩小为View的大小
LayerDrawable(重要)
层次化的Drawable集合,<layer-list>标签+<item>标签
一个layer-list可以有多个item,每个item表示一个Drawable,下面的item会覆盖上面的item
示例代码:
<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="#ffffff"/>
</shape>
</item>
<item android:bottom="1dp" android:left="1dp" android:right="1dp">
<shape android:shape="rectangle">
<solid android:color="#ffffff"/>
</shape>
</item>
</layer-list>
<item>属性android:left,android:right,android:top,android:bottom分别表示相对于View的位置偏移量
android:id,android:drawable可以引用一个已有的Drawable
StateListDrawable(重要)
也是一种Drawable的集合,每个Drawable对应View的一种状态,<selector>标签
示例代码:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/icon_weixin"/>
<item android:state_focused="true" android:drawable="@drawable/icon_wallet_x"/>
<item android:drawable="@drawable/icon_wallet_y"/>
</selector>
<selector>标签属性android:constantSize固有宽高是否随状态切换而改变android:variable,padding是否随状态切换而改变
<item>标签属性android:state_pressed按下状态,android:state_focused已经获取焦点状态,android:state_selected已经选择状态,
android:state_checked选中状态,android:state_enabled可用状态
LevelListDrawable
也是一种Drawable的集合,每个Drawable对应一个Level,<Level-list>标签
<item>设置android:maxLevel,android:minLevel
Level范围为0-10000
通过Drawable的setLevel或者控件的setXXXLevel来设置等级
TransitionDrawable
实现两个Drawable的淡入淡出效果,<transition>标签
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/icon_wallet_x"/>
<item android:drawable="@drawable/icon_wallet_y"/>
</transition>
然后可以通过startTransiton()等方法来进行操作
InsetDrawable
将其他Drawable内嵌入自己并留出一定间距,<inset>标签
用于View希望背景小于自己实际大小的时候使用
<inset>标签属性:android:insetLeft,android:insetRight,android:insetTop,android:insetBottom
ScaleDrawable
根据自己的Level将指定的Drawable进行缩放,<scale>标签
android:scaleHeight,android:scaleWidth,android:scaleGravity
ClipDrawable
根据自己的Level将指定的Drawable进行剪裁,<clip>标签
android:clipOrientation,android:gravity
自定义Drawable
代码实现,public class CustomDrawable extend Drawable
覆写方法:
draw,setAlpha,setColorFilter,getOpacity
一个重要概念,Drawable固有大小不等于实际大小,使用时还是会被拉伸或缩小为View的大小