Bitmap
位图,这和我们平常所接触的图片文件的概念,是最相似的
它通过直接保存所有像素色彩值的方式来存储图像
Picture
名字叫图片,但其实它是一个用于记录绘制过程的类
它通过一定的格式,可以把Canvas的drawText,drawLine,drawRect等各种绘制过程全部记录下来,并可以保存起来
当下次需要绘制相同图形时,再取出来就可以直接重新绘制
Picture的效率,甚至比直接调用Canvas的API更加高
因为Canvas在绘制时,需要计算绘制范围,曲线公式等参数,而Picture是直接保存最终结果
Drawable
Drawable是一个接口类,顾名思义,所有可绘制的东西,都可以是Drawable
Drawable是一个非常广泛的概念,它将Android中所有的,各种形式的图像资源,用统一的接口来表示
Drawable接口先将这些图像资源保存起来,然后在需要的时候,将它们绘制到对应View的Canvas上面
Drawable只是一个接口,具体图像如何保存,如何进行绘制,取决于具体子类的实现方式
几乎我们常用的所有图像资源,都有对应的Drawable子类与之对应,比如
BitmapDrawable:resource中的PNG资源,通过文件流读取的JPG图片等,内置了一个Bitmap对象
NinePatchDrawable:resource中的.9PNG资源
ColorDrawable:XmlResource中的color元素
ShapeDrawable:XmlResource中的shape元素
LayerDrawable:XmlResource中的layer-list元素
RippleDrawable:XmlResource中的ripple元素
StateListDrawable:XmlResource中的selector元素
GifDrawable:通过文件流读取的Gif图片
PictureDrawable:通过Picture生成,内置了一个Picture对象
AdaptiveIconDrawable:安卓APK自适应启动图标
这就是Drawable的精髓所在,任何类型的图像,最终都会被转化为Drawable,然后直接绘制到Canvas上即可
不同格式的图像资源如何绘制,由对应的Drawable子类决定即可,图像的使用者根本不用关心实现细节,这就解耦思想
明白这一点,我们也就可以理解,各种千奇百怪的XML资源,最终是如何变成图像的了
其实就是将XML里面的图形描述信息,状态描述信息,记录到Drawable里面,然后根据控件状态,绘制到Canvas上面
性能对比
由上面可以知道,Bitmap的性能最差,Picture的性能最好,Drawable的性能取决于具体的子类
最终结果就是,Picture >= Drawable >= Bitmap
但是这种比较实用意义不大,因为它们的使用场景不同