Drawbale 的使用范围很单一,一个是作为 ImageView 中的图像来显示,另外一个就是作为 View 的背景,大多数情况下 Drawbale 都是以 View 的背景这种形式出现的。Drawable 的工作原理很简单,其核心就是 draw 方法,可以通过重写 Drawable 的 draw 方法来自定义 Drawable。
通常我们没有必要去自定义 Drawable ,这是因为自定义的 Drawable 无法在 XML 中使用,这就降低了自定义的 Drawable 的使用范围。某些特殊情况下我们的确想自定义 Drawable ,这也是可以的。下面 CustomDrawable演示一个自定义 Drawable 的实现过程,我们通过自定义 Drawable 来绘制一个圆形的 Drawable,并且它的半径会随着 View 的变化而变化,这种 Drawable 可以作为 View 的通用背景,代码如下所示:
1 |
|
在上面的代码中,draw、setAlpha、setColorFilter 和 getOpacity 这几个方法都是必须要实现的,其中 draw 是最主要的方法,这个方法就和 View 的 draw 方法类似,而 setAlpha、setColorFilter 和 getOpacity 这三个方法的实现都比较简单。
上面的例子比较简单,但是流程是完整的,可以根据自己的需要实现更复杂的自定义 Drawable。另外 getIntrinsicWidth 和 getIntrinsicHeight 这两个方法需要注意一下,当自定义的 Drawable 有固定大小时最好重写这两个方法,因为它会影响到 View 的 wrap_content 布局,比如自定义 Drawable 是绘制一张图片,那么这个 Drawable 的内部大小就可以选用图片的大小,在上面的例子中,自定义的 Drawable 是由颜色填充的圆形并且没有固定的大小,因此没有重写这两个方法,这个时候它的内部大小为-1,即内部宽度和内部高度都为-1,需要注意的是,内部大小不等于 Drawable 的实际区域大小,Drawable 的实际区域大小可以通过它的 getBounds 方法来得到,一般来说它和 View 的尺寸相同。
自定义 Drawable 并非完全没有用的,它就是⼀个更加抽象和专注的、仅仅⽤于绘制的⾃定义 View 模块。需要共享在多个 View 之间的绘制代码,写在 Drawable ⾥,然后在多个⾃定义 View ⾥只要引⽤相同的 Drawable 就好,⽽不⽤互相粘贴代码。
参考资料:
《Android 开发艺术探索》任玉刚 第6章 6.3 自定义Drawable
腾讯课堂 HenCoder