关于Drawable的一些说明类的文字我就不写了,但是Drawable其实挺重要的,一些问题都关联着Drawable.
1.Drawable分类
- BitmapDrawable
- NicePatchDrawable
1.1BitmapDrawable详解
这几乎是最简单都得Drawable了,他表示的就是一张图片.在实际开发中,我们可以直接引用原始的图片,可可以通过XNML的方式来描述它,通过XML来描述的BitmapDrawable可以设置更多的效果,如下所示(这里先说一下可以设置的属性):
- android:src 图片的资源id;
- android:antialias 是否开启图片抗锯齿功能.开启后会让图片变得平滑,同时也会在一定程度上降低图片的清晰度,但是这个降低的幅度较低以至于可以忽略,因此抗锯齿选项应该开启;
- android:dither 是否开启抖动效果.当图片的像素配置和手机屏幕的像素配置不一致时,开启这个选项可以让高质量的图片在低质量的屏幕上还能保持较好的显示效果,比如图片的色彩模式为ARGB8888,但是在设备屏幕所支持的色彩模式为RGB555,这个时候开启抖动选项可以让图片显示不会过于失真.所以抖动效果也应该开启;
- android:filter 是否开启过滤效果.当图片尺寸被拉伸或者压缩时,开启过滤效果可以保持较好的显示效果,因此这个选项也应该开启.
- android:gravity 当图片小于容器的尺寸时,设置此选项可以对图片进行定位;
- android:mipMap 着时一种图像相关的处理技术,也叫纹理映射,比较抽象,这里不对其深入研究,默认值为false,在日常开发中此选项不常用;
- android:titleMode 平铺模式.有以下几个属性"disable","clamp","repeat","mirror"其中disable表示平铺模式,也是默认值,当开启平铺模式后,gravity属性会被忽略.这里主要说以下:repeat表示的时简单都的水平和竖直方向的平铺效果;mirror表示一种在水平和竖直方向上的镜面投影效果;而clamp表示的效果比较奇特,图片的四周的像素会扩展到周围区域
1.2NinePatchDrawable详解
它代表的是一张.9格式的图片,.9图片可以自动的根据所需要的高/宽进行相应的缩放并保证不失真,和BitmapDrawable一样,在实际使用中直接引用图片即可,里面用到的属性都一样,只是要通过<nine-path>标签进行描述.这里面src设置的图片要是一张.9的图,这个就比较尴尬了,why?为什么我不直接设置背景.
1.3ShapeDrawable详解
很常见的Drawable,可以理解为通过颜色来构造的图形,它既可以是纯色的图形,也可以是具有渐变效果的图形.(这里其实用的是shape标签常见的Drawable,其实体类实际是GradientDrawable),基本上有些简单的背景我们都可以使用这个标签去写
- android:shape 表示图形的形状,包含以下几个属性值,默认是矩形
- rectangle 矩形
- oval 椭圆
- line 线
- ring 圆环 针对这个形状,有5个特殊的属性
- android:innerRadius 圆环的内半径,和android:innerRadiusRatio同时存在时,以android:innerRadius为准
- android:thickness 圆环的厚度,即外半径减去内半径的大小,和android:thicknessRatio共同存在时,以android:thickness为准
- android:innerRadiusRatio 内半径占整个Drawable宽度的比例,默认值为9.如果为n,那么内半径=宽度/n
- android:thicknessRatio 厚度占整个Drawable宽度都的比例,默认值为3.如果为n,那么厚度=宽度/n
- android:useLevel 一般都应该使用false,否则有可能无法到达预期的显示效果,除非它被当成LevelListDrawable来使用
<corners>标签
- android:radius 为四个角同时设置角度
- android:topLeftRadius 设定左上角的角度
- android:topRightRadius 设定右上角的角度
- android:bottomLeftRadius 设定左下角的角度
- android:bottomRightRadius 设定右下角的角度
<gradient>标签
它与<solid>标签时互相排斥的,<solid>表示纯色,而<gradient>表示渐变效果
- android:angle 渐变的角度,默认为0,其值必须时45的整数倍,0表示从左到右,90表示从下到上,具体的效果需要自行体验,角度会影响渐变的方向.
- android:centerX 渐变的中心点横坐标
- android:centerY 渐变的中心点纵坐标
- android:startColor 渐变的其实色
- android:centerColor 渐变的中间色
- android:endColor 渐变的结束色
- android:gradientRadius 渐变半径,仅当android:type="radial"时有效
- android:useLevel 一般为false,有以下几个属性
- linear 线性渐变
- radial 径向渐变
- sweep 扫描线渐变
<solid>
- android:color shape填充的颜色
<stroke>
- android:width 描边的宽度
- android:color 描边的颜色
- android:dashWidth 组成虚线的线段的宽度
- android:dashGap 组成虚线的线段之间的间隔,间隔越大则虚线看起来空隙就越大
这里面注意一点就是如果android:dashWidth或者android:dashGap有一个为0则虚线不会出现
<padding>
- android:left/top/right/bottom 内边距
<size>
- android:width 宽度
- android:heeight 高度
1.4LayerDrawable详解
LayerDrawable对应的xml标签时<layer-list>,它表示一个层次话的Drawable集合,通过将不同的Drawable(可以时shape或者是其他的类型)放置在不同的层上面从而达到一种叠加后的效果.
一个简单的layer-list中可以包含多个item,每个item表示一个Drawable(代表一层,并且一层一层的叠加).Item的结构也比较简单,比较常见的属性有:android:top/bottom/left/right 它们分别表示Drawable相对于View的上下左右的偏移量,单位时像素.另外我们可以使用android:drawable属性来直接引用一个已有的Drawable资源,也可以在item中自定义Drawable.默认情况下,layer-list中的所有Drawable都会被缩至View的大小,相对于bitmap来说,需要使用android:gravity属性才能控制图片的显示效果.Layer-list有层次的概念,下面的item会覆盖上面的item,通过合理的分层,可以实现一些特殊的叠加效果.
1.4StateListDrawable详解
StateListDrawable对应于<selector>标签,它也是表示Drawable集合,每个Drawable都对应着View的一种状态,这样系统就会根据View的状态来选择合适的Drawable.StateListDrawable主要用于设置单机的View的背景,常见的是Button.
可以使用的一些标签说明
- android:constantSize 固定大小是否不随着其状体的改变而改变,因为状态的改变会导致StateListDrawable切换到具体的Drawable,而不同的Drawable具有不同的固定大小.true表示StateListDrawable的固有大小保持不变,这时它有固有大小时内部所有Drawable的固定大小的最大值,false则会随着状态都得改变而改变.此选项默认值为false.
- android:dither 是否开启抖动效果,开启此选项可以让图片在低质量的屏幕上仍然获得较好的显示效果.此选项默认值为true.
- android:variablePadding padding是否随着其状态的改变而改变,true表示会随着状态的改变而改变,false表示内部所有的Drawable的padding的最大值.默认值为false,不建议开启此选项.
<item>标签表示具体Drawable,他的结构也比较简单,但是里面主要的就是状态的Drawable信息.
- android:state_pressed 按下状态,按下没有松开时候的状态
- android:state_focused 获取焦点的状态(电视开发遥控器的问题)
- android:state_selected 用户选择的View
- android:state_checked 选中了View,一般适用于CheckBox这类选中和非选中状态之间的切换
- android:state_enabled 表示View当前处于可用状态
1.5LevelListDrawable详解
LevelListDrawable 对应于<level-list>标签,它同样表示一个Drawable集合,集合中的每个Drawable都有一个等级的概念.根据不同的等级,LevelListDrawable会切换对应的Drawable
- android:maxLevel 最大等级
- android:minLevel 最小等级
这里面也是每一个Item代表一个Drawable,但是设置等级只有两个等级,最大和最小,可以使用ImageView.setImageLevel方法来切换Drawable.最小值时0,最大值时10000.
1.6TransitionDrawable详解
TransitionDrawable对应<transition>标签,它用于实现两个Drawable的淡入淡出效果(注意Drawable,不是View,别和动画那个混了)
属性的问题都差不多,但是这里要你直接让你使用你还真不一定会.
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bitmap_1"/>
<item android:drawable="@drawable/bitmap_2"/>
</transition>
然后把这个当成一张图片设置给一个View,然后通过startTransiton(1000)进行开启,使用reverseTransition()关闭这个东西.其实我觉得这个动画效果和你点击换一张图片一样只是有一个时间差,有一个渐变效果.
1.7InsetDrawable详解
InsetDrawable对应于<inset>标签,它可以将其他Drawable内嵌到自己当中,并可以在四周流出一定的距离.当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现,同事我们知道,通过LayerDrawable也可以实现这种效果
- android:insetTop
- android:insetBottom
- android:insetLeft
- android:insetRight
上面这四个代表内凹的大小
其实这个里面也是可以放一些其他标签的如<shape>,直接在<inset>中添加<shape>标签就可以了,还可以添加<bitmap>等其他标签
1.8ScaleDrawable详解
ScaleDrawable对应于<scale>标签,它可以根据自己的等级(leve)l将指定的Drawable缩放到一定比例.
- android:scaleGravity 等同于shape中的android:gravity
- android:scaleWidth android:scaleHeight 分别表示指定Drwable宽高的缩放比例,注意这里是以百分比的形式展示,这里注意一个概念,缩放比
ps这里的等级可以使用对象.setLevel()方法进行设置,也可以用过getLevel()方法进行获取,但是当等级为0的时候这张图片是不会显示的因为
1.9ClipDrawable详解
ClipDrawable对应于<Clip>标签,它可以根据自己当前的等级(level)来裁剪另一个Drawable,裁剪方向可以通过android:clipOrientation和android:gravity这两个属性来控制
ps这个裁剪比例是按照你设置的等级进行裁剪的,打个比方,当你把等级设置成8000的时候,那么裁剪了2000,也就是裁剪了20%
上面只是一个基础的概念,其实关于Drawable基本上就是上面这些基本的类的使用,这里面使用的只是xml形式的,其实很多背景图片我们都能使用上面这些方法进行设置,平时多注意的话,能减少很多和美工的争执....