Drawable的简介:
Drawable表示的是一种可以在Canvas上进行绘制的抽象概念,它的种类有很多,常见的颜色和图片都可以是一个Drawable,非图片类型的Drawable占用空间较小(这对减小apk的大小很有帮助),Drawable常被用来作为 View的背景使用,一般通过XML来定义Drawable是一个抽象类,Drawable必须附在一个View上,绘制成什么样子,setBounds()来决定大小,由view的draw方法来绘制.,每个具体的Drawable都是它的子类,比如ShapeDrawable BitmapDrawable,如下图所示:
Drawable的内部宽高这个参数比较重要,通过getIntrinsicWidth和getIntrinsicHeight这2个方法可以获取到它们,但是并不是所有的
Drawable都有内部宽高,比如一张.png的图片形成的Drawable(例如BitmapDrawable),它的内部宽高就是图片的宽高,但是一个颜色形成的Drawable(ShapeDrawable)它就没有内部宽高(除非你主动设置它的width和height).Drawable内部宽高不等同于它的大小,一般来说Drawable没有大小的概念,当做View的背景时,Drawable会被拉伸至View的同等大小.
Drawable的分类
Drawable的种类比较多,:这里介绍一些稍微常用一点的Drawable,例如BitmapDrawable,ShapeDrawable,LayerDrawable等
BitmapDrawable:
它表示的是一张图片,在开发中,我们直接引用原始图片就可以了,也可以通过xml来描述,如下
下面是它各个属性的意思:
src:图片的资源id
antialias:是否开启图片抗锯齿功能,开启后会让图片变的圆滑,一般都是开启
dither:是否开启抖动效果,开启这个可以让高质量的图片在低质量的屏幕上还能 保持较好的显示效果,一般是开启
filter:是否开启过滤的效果,当图片尺寸被拉伸或者压缩时,开启过滤效果,可以让图片保持较好的显示,一般是开启
gravity:位置,例如:top,把图片放在图片的顶部
mipMap:纹理映射,一般是false
tileMode:平铺模式 这个选项有如下几个值:[disabled].[clamp].[repeat].[mirror]
disabled表示关闭平铺模式,这也是默认值.当开启平铺模式后,gravity属性会被忽略
clamp表示的图片四周的像素会扩展到周围区域
repeat表示的是简单的水平和竖直方向上的平铺效果
mirror表示的是水平和竖直方向上的镜面投影效果
具体如下图:
ShapeDrawable:
shapeDrawable可以理解为:通过颜色来构造图形,它既可以是纯色的图形也可以是具有渐变色效果的图形,默认没有原始大小
具体用法如下所示:
说明:
1,shape标签创建的Drawable,其实体类实际上是GradientDrawable,shape默认是矩形
2,solid指纯色填充,gradient是渐变色填充,2者是互斥的
3,padding标签这个空白,表示的不是shape的空白,而是包含它的View的空白
4,size标签它表示的shape的固有大小,就像bitmapDrawable的图片,图片有原始大小一样
对于bitmapDrawable的图片来说通过:getIntrinsicHeight,返回的是图片的高度
对于shapeDrawable来说通过getIntrinsicHeight返回的是size标签下指定的height,
默认情况下shapeDrawable没有配置size,height为0, 通过getIntrinsicHeight返回的就是-1,表示没有原始/固有大小
LayerDrawable:
layerDrawable对应的xml标签是,它表示的是一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果(例如,app引导页面的图片适配)
具体用法如下:
-
-
说明:
1,一个layer-list可以包含多个item,每个item表示一个drawable,多个item放在一起类似相对布局的叠加效果
2, android:left就类似android:paddingLeft一样的意思,表示drawable相对于view的左边的偏移量
3,默认情况下,layer-list中所有的drawable都会被缩放至view的大小,对于bitmap来说,需要使用android:gravity属性才能控制图片的显示效果
StateListDrawable: 状态选择器
StateListDrawable对应于selector标签 ,它表示的也是Drawable集合,selector里面可以有多个item,每个item的drawable对应View的一种状态,这样系统会根据View的状态来选择合适的Drawable,语法如下:
LevelListDrawable:
对应于level-list标签 ,它表示的也是Drawable集合,里面可以有多个item,每个item的drawable对应一种等级,这样根据不同的等级,LevelListDrawable会切换成对应的Drawable(等级按照顺序从小到大排序)
android:background="@drawable/image_leveldrawable"
android:src="@drawable/image_leveldrawable"
说明:
1.当我们将一个LevelListDrawable作为一个View的background后,可以通过View的getBackground()方法获取这个Drawable对象,然后调用这个Drawable对象的setLevel()方法,提供不同的Level值,就可以改变View的背景。这个可以用来制作诸如进度条、音量调节等效果(要先设置Background属性)
(注意;这个改变的是背景,使用的场景只能是View的宽高都不大的情况下,否则作为背景,图片会失真,比较模糊)
2.ImageView组件还提供了setImageLevel()方法来快捷设置android:src指定的LevelListDrawable的Level值(要先设置src属性)
(注意;这个改变的src属性对应的值,图片不会失真)
InsetDrawable:
InsetDrawable对应于inset标签,它可以将其他的Drawable内嵌到自己当中,并可以在4周流出一定间距,
当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现,用法如下:
还有一些我感觉不经常使用,但是也有一些使用场景的Drawable我也提一下:
1 ClipDrawable:对应的是clip标签,他可以根据自己当前的等级来裁剪另一个Drawable
使用场景是:a.麦克风录音机:用ClipDrawable实现音频录制麦克风讲话效果
b.还有手机电量的变化
2,RippleDrawable : Ripple:波纹 一般用于实现水波纹扩散的点击效果
res/drawable-v21/item_selector.xml
3,RotateDrawable: Rotate 旋转
使用场景:网易云音乐唱片机的旋转效果:用RotateDrawable实现网易云音乐唱片机效果