Drawable

Drawable
drawable是一种可以在Canvas上进行绘制的抽象的概念;
它的种类很多,最常见的颜色和图片都可以是drawable;

优点:
使用简单,比自定义view的成本要低;
非图片类型的drawable占用空间较小,这对减小apk的大小也很有帮助;

Drawable一般都是通过XML来定义的,当然在代码中自定义drawable也是可以的;
ps:其实在代码中自定义drawable更常用;

Drawable的内部宽/高
通过getIntrinsicWidth/getIntrinsicHeight这两个方法可以获取到Drawable的内部宽和高;
但并不是所有的Drawable都有内部宽/高;
如一张图片形成的Drawable,它的内部宽/高即是图片的宽/高;但是一个颜色形成的Drawable,它就没有内部宽/高的概念;
ps:Drawable的内部宽/高并不等于它的大小,因为Drawable没有大小的概念,被当做view的背景时,Drawable会被拉伸至view的同等大小;

1.BitmapDrawable
它表示的就是一张图片,可以通过XML来描述这张图片;
标签格式为<bitmam/>;
在XML中,可以设置如下属性;
src:图片资源id
antialias:抗锯齿,会让图片变得平滑,但是会在一定程度上降低清晰度,但是这个降低的幅度可以忽略不计;
dither:抖动效果,可以让高质量图片在低质量的屏幕上还可以保持较好的显示效果;
filter:过滤效果,当图片尺寸被拉伸或者压缩时,开启过滤效果可以保持较好的显示效果;
(ps:antialias,dither和filter都应开启)

gravity:当图片小于容器的尺寸时,该选项可以对图片进行定位;(注意,是是小于容器尺寸);
在不改变图片大小的情况下,可以将图片放置在容器的上下左右或者中间;
也可以使图片填充容器;

titleMode:平铺模式
disable:关闭平铺模式,默认值,开启平铺模式后,gravity属性会被忽略;
repeat:简单的水平和竖直方向的平铺效果;
mirror:在水平和竖直方向上的镜面投影效果;
clamp:图片四周的像素会扩展到周围区域

ps---> 用得最多的就是gravity和titleMode;

2.NinePatchDrawable
它是.9格式的图片,.9格式的图片会自动地根据所需的宽/高进行相应的缩放并不会失真;
标签格式为<nine-patch>;
它的属性和BitmapDrawable属性对应;

3.ShapeDrawable
通过颜色来构造的图形;既可以是纯色的图形,也可以是具有渐变效果的图形;
标签格式为:<shape/>
通过<shape/>标签创建的Drawable,其实体实际上GradientDrawable;
分解各属性含义:
<shape/>:有四个选项;
①rectangle(矩形)
②oval(椭圆)
③line(横线)
④ring(圆形)
默认的是矩形;另外,line和ring必须要通过<stroke>标签来指定线的宽度和颜色等等,否则无法达到预期的显示效果;
针对ring这个形状,有5个特殊的属性;
innerRadius:圆环的内半径,和innerRadiusRatio同时存在时,以innerRadius为主;
thickness:圆环的厚度,即外半径减去内半径的大小,和thicknessRatio同时存在时,以thickness为主;
innerRadiusRatio:内半径占整个Drawable宽度的比例,默认值为9;如果为n,那么内半径为 = 宽度/n;
thicknessRatio:厚度占整个Drawable宽度的比例,默认值为3;如果为n,那么内半径为 = 宽度/n;

<corners>表示shape四个角的角度,它只适用于矩形shape,这里的角度是指圆角的角度,用px来表示;
radius:为四个角同时设定相同的角度,优先级较低,会被其他四个属性覆盖;
topLeftradius:设定左上角的角度
topRightradius:设定右上角的角度
bottomLeftRadius:设定左下角的角度
bottomRightRadius:设定右下角的角度

<gradient>
它与<solid>标签是相互排斥的,其中solid表示纯色填充,而gradient则表示渐变效果;
angle:渐变的角度,默认为0,其值必须是45的倍数,0表示从左到右,90表示从下到上;
centerX:渐变的中心点的横坐标;
centerY:渐变的中心点的纵坐标;
startColor:渐变的起始色;
centerColor:渐变的中间色;
endColor:渐变的结束色;
gradientRadius:渐变半径,仅当type为radial时有效;
type:渐变类型,有linear(线性渐变),radial(径向渐变),sweep(扫面线渐变)

<solid>
表示纯色填充,通过color即可指定shape中填充的颜色;

<stroke>
shape的描边
width:描边的宽度,越大,shape的边缘线就会看起来越粗;
color:描边的颜色;
dashWidth:组成虚线的线段的宽度
dashGap:组成虚线的线段之间的间隔,间隔越大则虚线看起来空隙就越大;

<padding>
表示空白,但是表示的不是shape的空白,而是包含view的空白,有lest,right,top,bottem四个属性;

<size>
shape的大小,有两个属性,width和height,表示shape的宽和高;
这个表示shape的固有大小,但是一般来说它并不是shape最终显示的大小;
shape并没有宽高的概念,作为view它会自适应view的宽高;
如果通过<size>标签来指定宽/高信息,那么这个时候shape就有了所谓的固有宽/高;但是作为背景时,shape还会被拉伸或者缩小为view的大小;

4.StateListDrawable
对应于<selector>标签,它也是表示Drawable集合,每个Drawable都对应着view的一种状态;

constantSize:StateListDrawable的固有大小是否会随着其状态的改变而改变的;
True表示StateListDrawable的固有大小保持不变,这时它的固有大小是内部所有Drawable的固有大小的最大值;false则会随着状态的改变而改变,此选项默认值为false;

variablePadding:StateListDrawable的padding是否会随着其状态的改变而改变的;
true表示会改变,false表示不改变,padding是内部所有Drawable的padding的最大值;

<item>标签表示的是一个具体的Drawable,其中drawable是一个已有Drawable的资源id,剩下的属性表示的是view的各种状态;
view的常见状态
state_pressed:表示按下状态,比如button被按下后仍没有松开的状态;
state_focused:表示view已经获取了焦点;
state_selected:表示用户选择了view;
state_checked:表示用户选中了view,一般适用于CheckBox这类在选中和非选中状态之间进行切换的view;
state_enabled:表示view当前处于可用状态
系统会根据view当前的状态从selector中选择相应的item,每个item对应着一个具体的Drawable,系统按照从上到下的顺序查找,直至查找到第一条匹配的item;

5.LayerDrawable
对应于<layer-list>标签,一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果;
一个layer-list中可以包含多个item,每个item表示一个Drawable;
item的结构比较简单,常用的属性有top,left,bottom,right,它们分别表示Drawable相对于View的上下左右的偏移量;
默认情况下,layer-list中的所有Drawable都会被缩放至View的大小;

6.LevelListDrawable
对应于<level-list>标签;表示一个drawable集合,集合中的每个drawable都有一个等级的概念;根据不同的等级,LevelListDrawable会切换为对应的Drawable;
item中常用的属性是maxLevel,minLevel;
可以在代码中通过Drawable的setLevel方法来设置不同的等级;
还可以通过ImageView的setImageLevel来切换;
level的范围是0~10000;

7.TransitonDrawable
对应于<transiton>标签,用于实现两个Drawable之间的渐入渐出效果;
在代码中通过TransitonDrawable.startTransiton方法来开启,还可以设置逆效果;

8.InsetDrawable
对应于<inset>标签,可以将其他Drawable内嵌到自己的当中;并可以在四周留出一些间距

9.ScaleDrawable
对应于<scale>标签,根据自己的等级将指定的Drawable缩放到一定的比例;

10.ClipDrawable
对应于<clip>标签,可以根据自己当前的等级来裁剪另一个Drawable;


11.自定义Drawable
自定义drawable中,最重要的是重写draw()方法;
内部大小不等于Drawable的实际大小,实际区域大小可以通过他的getBoundS方法得到;

转载于:https://my.oschina.net/u/3491256/blog/1543933

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值