Drawable
是一个抽象类,是对可绘制物件的抽象。与View
不同,Drawable
没有事件和交互方法。
Drawable
有好多子类操作具体类型资源,比如
BitmapDrawable
是用来操作位图
ColorDrawable
是用来操作颜色
ClipDrawable
是用来操作剪切板
Drawable
原理
- draw(Canvas canvas)
- setBounds()
BitmapDrawable
BitmapDrawable
是对bitmap
的一种包装,可以设置它包装的bitmap
在BitmapDrawable
区域内的绘制方式
如平铺填充、拉伸填充或保持原始图片大小
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/background"
android:tileMode="mirror"
android:antialias="true"
android:dither="true">
</bitmap>
在布局文件中通过
android:background="@drawable/xxx"
引用
LayerDrawable
LayerDrawable
可以管理一组drawable
对象,在LayerDrawable
的drawable
资源按照列表的顺序绘制,列表的最后一个drawable
绘制在最上层。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/background"
android:gravity="center"
android:left="20dp"
android:top="20dp" />
<item
android:drawable="@drawable/avatar"
android:gravity="center"
android:left="20dp"
android:top="20dp" />
</layer-list>
StateListDrawable
StateListDrawable
就是一个在xml文件中定义,StateListDrawable
可以根据不同的状态提供不同的背景。比如,一个按钮有多种状态,获取焦点,失去焦点,点击。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_focused="true"
android:drawable="@drawable/avatar1"/>
<item
android:state_pressed="true"
android:drawable="@drawable/avatar2"/>
<item
android:state_selected="true"
android:drawable="@drawable/avatar3"/>
<item
android:drawable="@drawable/avatar_default"/>
</selector>
LevelListDrawable
LevelListDrawable
管理一组drawable
资源
LevelListDrawable
里面的每一个drawable
资源与一个最大数值结合起来,作为LevelListDrawable
资源的一项。
调用Drawable
的setLevel()
方法可以加载level-list
或代码中定义的某个drawable
资源。
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/background"
android:minLevel="6"
android:maxLevel="10"/>
<item android:drawable="@drawable/background"
android:minLevel="12"
android:maxLevel="16"/>
</level-list>
setImageLevel()
方法设置当前的level
TransitionDrawable
TransitionDrawable
是LayerDrawable
的子类,不过它只负责管理两层drawable
,并且提供了一个透明度变化的动画,可以控制从一层drawable
过渡到另外一层drawable
的动画效果
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/background1"/>
<item android:drawable="@drawable/background2"/>
</transition>
InsetDrawable
InsetDrawable
表示一个drawable
嵌入到另外一个drawable
内部,并且在内部留一些间距,这一点很像drawable
的padding
属性
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/background"
android:inset="50dp">
</inset>
ClipDrawable
ClipDrawable
是对Drawable
进行剪切操作,控制剪切区域
setLevel(int level)方法来设置剪切区域;level取值0~10000,0表示完全不显示,10000表示全部显示。
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/background"
android:clipOrientation="vertical"
android:gravity="center">
</clip>