Android的Drawable
概念
-
Andoird中的Drawable表示的是图像的概念,不等于具象的图片,也可以是颜色,形状...
-
Drawable可以使用XML定义或者使用代码定义;
-
Drawable是一个抽象类,每一个具体的Drawable都是其的子类,如ShapeDrawable,BitmapDrawable...
Drawable的宽/高
Drawable可以使用getIntrinsicHeight()或者使用getIntrinsicWidth()获取它的内部长度和内部宽度;
并不是所有的Drawable都有高宽,图片Drawable的内部高宽就是其内部图片的长宽,颜色Drawable则没有高宽的概念;
Drawable自身没有宽高概念,当它作为View的背景时,将会被拉伸至View的同等大小;
常见的Drawable
BitmapDrawable
BitmapDrawable表示的是一张图片,通过XML定义它可以设置很多效果,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<bitmap
android:mipMap="true|fase" //纹理映射 不常用
android:src="" //图片的资源Id
android:antialias="" //是否开启图片的抗锯齿
android:dither="true|fase" //自适应 当图片的原本色彩模式和当前机型兼容的色彩模式不兼容时,可以减少失真
android:filter="true|fase"//过滤 用于优化图像被拉伸或者压缩后的显示效果
android:gravity="" //图片的定位
android:tileMode="" //无法充满时的填充模式 和gravity互斥
xmlns:android="http://schemas.android.com/apk/res/android">
</bitmap>
NinePathDrawable和BitmapDrawable类似
<?xml version="1.0" encoding="utf-8"?>
<nine-patch
android:mipMap="true"
android:src=""
android:alpha=""
android:dither=""
android:filter=""
android:gravity=""
android:antialias=""
android:tileMode=""
xmlns:android="http://schemas.android.com/apk/res/android">
</nine-patch>
但表示的是.9图,BitmapDrawable同样可以使用.9图,且代表一个.9图;
ShapeDrawable
ShapeDrawable表示的包含颜色的图形,整个图形可以是纯色的,也可以是渐变的;
<?xml version="1.0" encoding="utf-8"?>
<shape
android:shape="oval|line|rectangle|ring"
xmlns:android="http://schemas.android.com/apk/res/android">
<corners
android:radius=""
android:bottomLeftRadius=""
android:topLeftRadius=""
android:topRightRadius=""
android:bottomRightRadius=""
/>
<gradient
android:angle=""
android:centerX=""
android:centerY=""
android:startColor=""
android:centerColor=""
android:endColor=""
android:gradientRadius=""
android:type=""
/>
<solid android:color=""/>
<padding
android:top=""
android:left=""
android:right=""
android:bottom=""/>
<size
android:width=""
android:height=""/>
</shape>
- android:shape
表示的是整个图形的形状,有oval(圆形),line(线),rectangle(矩形),ring(圆环)四种形状,默认为矩形;line和ring必须配合<stroke>来指定宽度和颜色,否则无法达到预期效果;
对于ring,有五个特殊的属性
android:innerRadius="" 圆环内圆半径 优先级高于innerRadiusRatio
android:innerRadiusRatio="x" 内径占比 内半径 = 宽度/x
android:thicknessRatio="" 内半径占整个Drawable宽度的比例
android:thickness="" 圆环厚度 优先级高于thicknessRatio
android:useLevel="" 一般为false 除非作为LevelDrawable来使用
- <corners>
用于表示边角的角度
android:radius="" 优先级最低 全局的边角角度
android:bottomLeftRadius="" 左下的角度
android:topLeftRadius="" //左上的角度
android:topRightRadius="" //右上的角度
android:bottomRightRadius="" //右下的角度
- <gradient>
与<solid>标签互斥,表示渐变填充,拥有的属性如下
<gradient
android:angle="" 渐变角度 默认为0 必须为45的倍数
android:centerX="" 渐变中心点的x坐标
android:centerY="" 渐变中心点的y坐标
android:startColor="" 渐变的起始色
android:centerColor="" 渐变的中心色
android:endColor="" 渐变的结束色
android:gradientRadius="" 渐变半径
android:type="" //渐变的类型 linear(线性,默认)|radial(径向渐变)|sweep(扫描线渐变)
/>
- <solid>
表示纯色填充 通过android:color可指定颜色
- <stroke>
描边,属性描述如下
<stroke
android:color="" 描边的颜色
android:dashGap="" 组成虚线的线段之间的距离
android:dashWidth="" 线段宽度
android:width="" 描边的宽度
/>
-
<padding> 表示留白,通过android:left,android:right,android:top,android:bottom表示四个方向的padding
-
<size>
表示的是这个形状的固有大小,getIntrinsicHeight()或者使用getIntrinsicWidth()即可获得这个值,但是shape本身是没有宽高概念的,设置为View背景依旧会被拉伸成View的大小,如果不设置size,我们通过getIntrinsicHeight()或者使用getIntrinsicWidth()获取的值为-1;
LayerDrawable
<?xml version="1.0" encoding="utf-8"?>
<layer-list
android:shape="ring"
android:innerRadius=""
android:innerRadiusRatio=""
android:thicknessRatio=""
android:thickness=""
android:useLevel=""
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:height=""
android:width=""
android:right=""
android:left=""
android:top=""
android:bottom=""
android:gravity=""
android:id=""
android:drawable=""
android:end=""
android:start=""
>
...其他Drawable
</item>
<item>
...其他Drawable
</item>
</layer-list>
表示的是层级化的Drawable集合,可以把不同的drawable放在内部的item标签中,从而达到一种叠加后效果,通过item的子属性可以对内部的drawable进行定位,内部的drawable都会缩放至view的实际大小,根据item的位置,越下面声明的item,显示优先级越高;
StateListDrawable
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:dither="true">
<item android:drawable="@drawable/ic_ti_reset_enabled"
android:state_enabled="true" />
<item android:drawable="@drawable/ic_ti_reset_disenabled" android:state_enabled="false" />
</selector>
StateListDrawable对应<selector>,内部每个Drawable对应的不同状态下的View显示Drawable背景; 状态集合如下:
| 属性值 | 含义 |
|---|---|
| android:state_active | 是否激活 |
| android:state_checkable | 是否可勾选 |
| android:state_checked | 是否已勾选 |
| android:state_enabled | 是否可用 |
| android:state_active | 是否激活 |
| android:state_first | 是否在开始状态 |
| android:state_focused | 是否获得焦点 |
| android:state_last | 是否属于结束状态 |
| android:state_middle | 是否属于中间状态 |
| android:state_pressed | 是否按下 |
| android:state_selected | 是否选中 |
| android:state_window_focused | 是否窗口获得焦点 |
LevelListDrawable
LevelListDrawable对应的标签为<level-list>,内部每个item可以表示一个drawable,并且有对应的等级范围,使用此drawable做背景的时候,可以使用setLevel方法设置不同的等级从而切换具体的drawable,但等级的数值是有限制的最大10000,最小0
<?xml version="1.0" encoding="utf-8"?>
<level-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:maxLevel="100"
android:minLevel="1"
android:drawable=""
/>
</level-list>
TransitionDrawable
对应的标签为<transition>,内部item可以指定drawable和进行内部定位,可以通过 drawable.startTransition()和drawable.reverseTransition()进行顺序动画或者逆向动画