Drawable在我们平时的开发中,基本都会用到。但它到底是什么呢?引用代码的里面注释:
能够在canvas上绘制的一个东西。而且相比于View,并不需要measure,layout,仅仅只要去考虑如何draw。
1 自定义Drawable时候,相比View来说,它属于轻量级的,使用也简单,以后当我们自定义一个效果的时候,可以改变一下思想,在考虑自定义View的时候,也考虑下自定义Drawable能不能实现需要的效果。
2 它是一个抽象类,它仅仅是处理可以画的东西,不像View,她没有接收事件跟用户交互的机制。
3 图片作为 View 的背景,减少 apk 的体积(减少 apk 体积最明显最有效的步骤就是去掉图片)
4 图片耗内存,使用 Drawable 节省内存,Android 本身对 Drawable 做了很好的优化(内存优化需要考虑)
一般情况下,除了直接使用放在Drawable下的图片,其实的Drawable的用法都和xml有关,我们可以使用shape,layer-list等标签绘制一些背景,还可以通过selector标签实现View的状态效果,当然我们自己也还是可以自定义Drawable状态的。
我们的每个标签都对应于一个真正的实体类,关系如下:
下面我们来自定义Drawable来实现圆角图片,圆形图片。而且更加简单,高效,使用范围更广(可以作为任何View的背景)。
核心代码就是:
canvas.drawRoundRect(mRectF, 100, 100, mPaint);
mRectF是在setBounds方法里面赋值的,mPaint是在构造方法里面通过BitmapShader构造赋值的。
当自定义圆形Drawable的写法:
核心代码就是canvas.drawCircle(mWidth /2, mWidth /2, mWidth /2, mPaint);
mWidth取的是图片宽高最小的那个,mPaint就是构造方法使用BitmapShader赋值的,BitmapShader又是通过当我们使用drawable时候传bitmap过去创建的。
总结:本篇主要是想学习自定义Drawable,学会自定义drawable,有时在自定义View时候有这么个意识,我们代码会写的更加优雅。