https://www.jianshu.com/p/1fdd0a23fab5

一、Drawable官方定义

Drawable 是 “所有可绘制东西” 的一个抽象,大多数时候,我们只需要把各种不同类型的资源作为转化为 drawable,然后 View 会帮我们把它渲染到屏幕上。Drawable 类提供了一个通用 API,用于解析转化各种可视资源到 Canvas,跟 View 不一样,Drawable 不能接受任何事件以及用户交互。

二、Drawable如何绘制到View上

View 通过 setBackground 方法为自己设置了一个 drawable 对象后,而 drawable 又有一个 draw 方法,那么 View 绘制自己的背景时,直接调用 drawable 对象的的 draw 方法,这个 draw 方法需要一个 canvas 对象,这里可直接把 View 的 Canvas 对象传递过去,那么 Drawable 就可以成功的把自己的绘制内容应用到 View 之上。

三、Drawable分类

https://www.jianshu.com/p/4cd87e3c43d6?winzoom

https://www.cnblogs.com/Jeely/p/11045042.html (详细的标签属性)

1.GradientDrawable

一个创建几何图形的 Drawable,图形包括直线(line), 椭圆(oval),圆形(oval,当椭圆的宽高相等的时候就是圆形),矩形(rectangle),圆环(ring)。

在 XML 文件中对应的根节点为 <Shape>

子结点
- Stroke( 描边,对应 Paint.STROKE )
- Solid (填充,对应 Paint.FILL)

绘制原理:
利用Canvas.drawCircle()、Canvas.drawRect() 等等方法

2.BitmapDrawable

用于图片的平铺( tileMode )显示

在 XML 文件中对应的根节点为 <bitmap>

tileMode
- disable:不解释,默认不平铺
- clamp:当位图小于实际显示区域的时候,边缘的颜色拉伸
- repeat:当位图小于实际显示区域的时候,水平和垂直方向,重复显示图片
- mirror:当位图小于实际显示区域的时候,水平和垂直方向,以镜像的方式(或者说对称的方式)重复显示图片

3.LayerListDrawable

图层列表,叠加多个drawable(可以是不同类型的drawable)
在 XML 文件中对应的根节点为 <layer-list>

注意事项:
- 我们用 控制显示的大小和位置,而用 的子节点控制显示区域,如 等等 Drawable
- 不用显示图片因为图片会根据显示区域缩放,如果我们将图片放在子节点中,例如 ,就算图片小于显示区域也不会放大。

4.StateListDrawable

状态列表,根据状态来显示图片。
在 XML 文件中对应的根节点为 <selector>

5.LevelListDrawable

等级列表,根据等级来显示图片。
在 XML 文件中对应的根节点为 <level-list>

6.TransitionDrawable

在两个图像之间,通过改变 alpha 来交替显示。
在 XML 文件中对应的根节点为 <transition>

7.InsetDrawable

插入式的 Drawable,自带padding的drawable。
在 XML 文件中对应的根节点为 <inset>

8.ClipDrawable

可裁剪的 Drawable
在 XML 文件中对应的根节点为 <clip>

通过setLevel设置截取的区域大小,取值0~10000.

8.ScaleDrawable

可缩放的 Drawable
在 XML 文件中对应的根节点为 <scale>
需要指定三个属性才能正常缩放

android:scaleGravity="center_vertical|center_horizontal"
android:scaleHeight="50%"
android:scaleWidth="50%"

通过setLevel设置截取的区域大小,取值0~10000.

四、Drawable重要API

bounds四个参数:

- draw(@NonNull Canvas canvas)
drawable将自己绘制到canvas上,可以看各种XXXDrawable的源码会发现,draw方法是通过Paint在cavas上“作画”的。

  • getIntrinsicWidth()
    getIntrinsicWidth() 是原有宽度,有时候原有宽度可能很大,但是实际上空间不够,所有效果上并没有那么大,这个方法可以获得原有宽度,可以辅助测量的时候选择合适的展示宽度。
分类: Drawable

0 条评论

发表回复

您的电子邮箱地址不会被公开。