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>
注意事项:
- 我们用
- 不用
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() 是原有宽度,有时候原有宽度可能很大,但是实际上空间不够,所有效果上并没有那么大,这个方法可以获得原有宽度,可以辅助测量的时候选择合适的展示宽度。
0 条评论