根据《Android 开发艺术探索》第6章 Android的Drawable 整理
BitmapDrawable
BitmapDrawable 是最简单的 Drawable,它表示的就是一张图片。
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@[package:]drawable/drawable_resource"
android:antialias=["true" | "false"]
android:dither=["true" | "false"]
android:filter=["true" | "false"]
android:gravity=["top" | "bottom"|"left"|"right" | "center_vertical" |
"fill_vertical"|"center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]
android:mipMap=["true" | "false"]
android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
属性含义:
android:src 图片的资源id
android:antialias 是否开启抗锯齿,一般开启
android:dither 是否开启抖动效果,默认为 true,一般开启
android:filter 是否开启过滤效果,一般开启
android:gravity 对图片进行定位
android:mipMap 纹理映射,一般关闭
android:tileMode 平铺模式,开启后gravity属性会被忽略
ShapeDrawable
ShapeDrawable 通过颜色来构造的图形,它既可以是纯色的图形,也可以是具有渐变效果的图形。
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=["rectangle" | "oval" | "line" | "ring"] >
<corners
android:radius="integer"
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer" />
<gradient
android:angle="integer"
android:centerX="integer"
android:centerY="integer"
android:centerColor="integer"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type=["linear" | "radial" | "sweep"]
android:useLevel=["true" | "false"] />
<padding
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer" />
<size
android:width="integer"
android:height="integer" />
<solid
android:color="color" />
<stroke
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer" />
</shape>
属性含义:
android:shape 图形的形状
<corners> shape的四个角的角度,只适用于矩形 shape,单位为 px,有以下5个属性
android:radius 为四个角同时设定相同的角度,优先级较低,会被其他四个属性覆盖
android:topLeftRadius 设定最上角的角度
android:topRightRadius 设定右上角的角度
android:bottomLeftRadius 设定最下角的角度
android:bottomRightRadius 设定右下角的角度
<gradient> 渐变色填充,与 solid 互斥,有以下 9 个属性
android:angle 渐变的角度,默认为0,其值必须为45的倍数,0表示从左到右,90表示从下到上
android:centerX 渐变的中心点的横坐标
android:centerY 渐变的中心点的纵坐标,渐变的中心点会影响渐变的具体效果
android:startColor 渐变的起始色
android:centerColor 渐变的中间色
android:endColor 渐变的结束色
android:gradientRadius 渐变半径,仅当 android:type= "radial" 时有效
android:useLevel 一般为 false,当 Drawable 作为 StateListDrawable 使用时为true
android:type 渐变的类别,有 linear(线性渐变)、radial(径向渐变)、 sweep(扫描线渐变)三种,其中默认值为线性渐变
<solid> 纯色填充,通过 android:color 即可指定 shape 中填充的颜色
<stroke> 描边,有以下4个属性
android:width 描边的宽度,越大则 shape 的边缘线就会看起来越粗
android:color 描边的颜色
android:dashWidth 组成虚线的线段的宽度
android:dashGap 组成虚线的线段之间的间隔,间隔越大则虚线看起来空隙就越大
<padding> 包含此 Drawable 的View的空白,通过 android:left、android:top、android:right 和 android:bottom 四个属性控制
<size> 宽高,即使设置了宽高, Drawable 作为 View 背景时,还是会自适应 View 的宽高
当 shape 为 ring 时,有5个特殊属性
ring的属性值.pngLayerDrawable
LayerDrawable 表示一种层次化的 Drawable 集合,通过将不同的 Drawable 放置在不同的层上面从而达到一种叠加后的效果。
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@[package:]drawable/drawable_resource"
android:id="@[+][package:]id/resource_name"
android:top="dimension"
android:right="dimension"
android:bottom="dimension"
android:left="dimension" />
</layer-list>
一个 layer-list 中可以包含多个 item,每个 item 表示一个 Drawable。常用的属性有android:top、android:bottom、android:left 和 android:right,它们分别表示 Drawable 相对于View 的上下左右的偏移量,单位为 px。layer-list 有层次的概念,下面的 item 会覆盖上面的 item。
StateListDrawable
StateListDrawable 表示一个 Drawable 集合,集合中每个 Drawable 都对应着 View 的一种状态,这样系统就会根据 View 的状态来选择合适的 Drawable。 StateListDrawable 主要用于设置可单击的 View 的背景,最常见的是 Button。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize=["true" | "false"]
android:dither=["true" | "false"]
android:variablePadding=["true" | "false"]>
<item
android:drawable="@[package:]drawable/drawable_resource"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_hovered=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_activated=["true" | "false"]
android:state_window_focused=["true" | "false"] />
</selector>
属性含义:
android:constantSize 固有大小是否不随着其状态的改变而改变,值为 false 时,Drawable 的固有大小始终是当前显示的 Drawable
android:dither 抖动效果,默认为 true,一般开启
android:variablePadding padding 是否随着其状态的改变而改变,true 表示会随着状态的改变而改变,false 表示 StateListDrawable 的 padding 是内部所有 Drawable 的 padding 的最大值。默认为 false,一般不开启
<item> 表示一个具体的 Drawable,内部包含5个属性,表示不同的状态
系统会根据 View 当前的状态从 selector 中选择对应的 item,每个 item 对应着一个具体的 Drawable,系统按照从上到下的顺序查找,直至查找到第一条匹配的 item。一般来说,默认的 item 都应该放在 selector 的最后一条并且不附带任何的状态,这样当上面的 item 都无法匹配 View 的当前状态时,系统就会选择默认的 item,因为默认的 item 不附带状态,所以它可以匹配 View 的任何状态。
LevelListDrawable
LevelListDrawable 它同样表示一个 Drawable 集合,集合中的每个 Drawable 都有一个等级(level)的概念。根据不同的等级,LevelListDrawable 会切换为对应的 Drawable。
<?xml version="1.0" encoding="utf-8"?>
<level-list
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/drawable_resource"
android:maxLevel="integer"
android:minLevel="integer" />
</level-list>
TransitionDrawable
TransitionDrawable 用于实现两个 Drawable 之间的淡入淡出效果。
<?xml version="1.0" encoding="utf-8"?>
<transition
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@[package:]drawable/drawable_resource"
android:id="@[+][package:]id/resource_name"
android:top="dimension"
android:right="dimension"
android:bottom="dimension"
android:left="dimension" />
</transition>
InsetDrawable
InsetDrawable 可以将其他 Drawable 内嵌到自己当中,并可以在四周留出一定的间距。
<?xml version="1.0" encoding="utf-8"?>
<inset
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:insetTop="dimension"
android:insetRight="dimension"
android:insetBottom="dimension"
android:insetLeft="dimension" />
ScaleDrawable
ScaleDrawable 可以根据自己的等级(level)将指定的 Drawable 缩放到一定比例。
<?xml version="1.0" encoding="utf-8"?>
<scale
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical"
|"fill_vertical" | "center_horizontal" | "fill_horizontal"
| "center" | "fill" | "clip_vertical" | "clip_horizontal"]
android:scaleHeight="percentage"
android:scaleWidth="percentage" />
ClipDrawable
ClipDrawable 可以根据自己当前的等级(level)来裁剪另一个 Drawable,裁剪方向可以通过 android:clipOrientation 和 android:gravity 这两个属性来共同控制。
<?xml version="1.0" encoding="utf-8"?>
<clip
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:clipOrientation=["horizontal" | "vertical"]
android:gravity=["top" | "bottom"|"left" | "right"|"center_vertical" |
"fill_vertical"|"center_horizontal"|"fill_horizontal" |
"center" | "fill"|"clip_vertical"|"clip_horizontal"] />
网友评论