Drawable:Android中是指可在屏幕上绘制的图形。Android里面有以下几种常见的Drawable(他们都继承自Drawable):位图文件(BitmapDrawable)、9.png文件(NinePatchDrawable)、图层列表(LayerDrawable)、状态列表(StateListDrawable)、级别列表(LevelListDrawable)、转换可绘制对象(TransitionDrawable)、插入可绘制对象(InsetDrawable)、裁剪可绘制对象(ClipDrawable)、缩放可绘制对象(ScaleDrawable)、形状可绘制对象(ShapeDrawable)。
一、位图(BitmapDrawable)
位图应该是开发过程中使用最多的Drawable资源了。位图分两种:位图文件、XML位图。
1.1、位图文件
一般美工直接给到我们的就是位图文件了。Android 支持三种格式的位图文件:.png(首选)、.jpg(可接受)、.gif(不建议)。
-
位图文件位置:res/drawable/filename.png(.png、.jpg 或 .gif),当然了至于是drawable-xhdpi、drawable-xxhdpi、还是drawable-xxxhdpi等文件夹就需要根据美工的出图标准来了。
-
资源类型对象:BitmapDrawable。
1.2、XML位图
XML位图对应<bitmap>标签,是在XML中定义的资源,指向位图文件。同时可以对位图文件添加一些额外的属性,例如抖动和层叠等等。
-
XML文件位置:res/drawable/filename.xml。
-
资源类型对象:BitmapDrawable。
-
XML位图标签解释:
<?xml version="1.0" encoding="utf-8"?>
<!-- 定义位图来源及其属性 -->
<bitmap
<!-- 字符串。定义 XML 命名空间 -->
xmlns:android="http://schemas.android.com/apk/res/android"
<!-- 可绘制对象资源(位图文件) -->
android:src="@[package:]drawable/drawable_resource"
<!-- 启用或停用抗锯齿 -->
android:antialias=["true" | "false"]
<!-- 当位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕),启用或停用位图抖动 -->
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"]
<!-- 启用或停用 mipmap 提示 -->
android:mipMap=["true" | "false"]
<!-- 定义平铺模式。当平铺模式启用时,位图会重复。重力在平铺模式启用时将被忽略 -->
<!-- disabled:不平铺位图。默认值 -->
<!-- clamp:当着色器绘制范围超出其原边界时复制边缘颜色 -->
<!-- repeat:水平和垂直重复着色器的图像 -->
<!-- mirror:水平和垂直重复着色器的图像,交替镜像图像以使相邻图像始终相接 -->
android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
二、9.png(NinePatchDrawable)
在Android开发过程中很多控件需要适配不同的手机分辨率进行拉伸或者压缩,这个时候就产生了NinePatchDrawable,它可以指定特定的区域进行拉伸而不失真,同时可以指定前景内容(内容区域)的显示区域。
和位图一样9.png也分为两种:9.png文件、XML 9.png。
2.1、9.png文件
.9.png图片格式,保证图片被拉伸的时候不失真,是一种特殊的图片格式。
-
9.png文件位置:res/drawable/filename.9.png.
-
资源类型对象:NinePatchDrawable。
2.2、XML 9.png
XML 9.png对应<bitmap>标签,是在XML中定义的资源,指向9.png文件。可以对.9.png文件添加一些额外的属性,例如抖动
-
文件位置:res/drawable/filename.xml。
-
资源类型对象:NinePatchDrawable。
-
XML位图标签解释:
<?xml version="1.0" encoding="utf-8"?>
<!-- 定义位图来源及其属性 -->
<nine-patch
<!-- 字符串。定义 XML 命名空间 -->
xmlns:android="http://schemas.android.com/apk/res/android"
<!-- 可绘制对象资源(.9.png 文件) -->
android:src="@[package:]drawable/drawable_resource"
<!-- 当位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕),启用或停用位图抖动 -->
android:dither=["true" | "false"] />
三、图层列表(LayerDrawable)
LayerDrawable:对应标签<layer-list>, 将多个drawable按照顺序层叠在一起显示。<layer-list>里面的每一个item都相当于一个Drawable。每个item按照列表的顺序绘制,最后一个item绘于顶部。
-
文件位置:res/drawable/filename.xml。
-
资源类型对象:LayerDrawable。
-
XML标签解释:
<?xml version="1.0" encoding="utf-8"?>
<!-- 图层列表资源文件的根元素,包含一个或多个 <item> 元素 -->
<layer-list
<!-- XML命名空间,必须 "http://schemas.android.com/apk/res/android" -->
xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 定义每一层的item -->
<item
<!-- 可绘制对象资源 -->
android:drawable="@[package:]drawable/drawable_resource"
<!-- 资源ID。此可绘制对象的唯一资源ID -->
android:id="@[+][package:]id/resource_name"
<!-- 顶部偏移 -->
android:top="dimension"
<!-- 右边偏移 -->
android:right="dimension"
<!-- 底部偏移 -->
android:bottom="dimension"
<!-- 左边偏移 -->
android:left="dimension" />
</layer-list>
-
应用场景:实现阴影效果、单边显示(下划线)、加号等等。
LayerDrawable.png
四、状态列表(StateListDrawable)
StateListDrawable:对应标签<selector>,这个也是我们开发过程中经常要用到的Drawable。背景选择器让控件可以根据不同状态显示不同的背景(每一种状态对应一个<item>标签)。例如,Button有多种不同状态(按下、松开或这两种状态都不是),这样可以在Button按下的时候显示一种背景,松开的时候又显示另一种背景。
从上到下遍历状态列表,并使用第一个与当前状态匹配的项目 —此选择并非基于“最佳匹配”。这也是默认值为啥要放在最后面的原因。
-
XML文件位置:res/drawable/filename.xml。
-
资源类型对象:StateListDrawable。
-
XML标签解释:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
<!-- 如果可绘制对象报告的内部大小在状态变更时保持不变,则值为true。如果更加变化则为false -->
android:constantSize=["true" | "false"]
<!-- 将在位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕)启用位图的抖动 -->
android:dither=["true" | "false"]
<!-- 如果可绘制对象的内边距应根据选择的当前状态而变化,则值为“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>
注:如果要多个状态同时满足,可以在同一个item里面指定多个状态,例如:<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/pic3" /> 触摸模式下单击时的背景图片
五、级别列表(LevelListDrawable)
LevelListDrawable:对应<level-list>标签,根据Drawable的setLevel()函数设置的level。显示不同的背景。有时候需要我们确实需要对一个View设置很多不同图片以表示某种应用状态,比如,手机的信号强度从强到弱有多种状态图;wifi有解锁和未解锁状态。使用的时候需要配合Drawable的setLevel()函数设置级别(level范围:0~10000)。 根据设置的级别来找<level-list>标签里面对应的<item>
-
XML文件位置:res/drawable/filename.xml。
-
资源类型对象:LevelListDrawable。
-
XML标签解释:
<?xml version="1.0" encoding="utf-8"?>
<level-list
xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 定义要在某特定级别使用的可绘制对象 -->
<item
<!-- 可绘制对象资源 -->
android:drawable="@drawable/drawable_resource"
<!-- 该item level允许的最大值 -->
android:maxLevel="integer"
<!-- 该item level允许的最小值 -->
android:minLevel="integer" />
</level-list>
android:maxLevel和android:minLevel:当Drawable调用setLevel()函数设置的级别处于两者之间则显示该<item>对应的资源。
-
实例:
LevelListDrawable.gif
六、转换可绘制对象(TransitionDrawable)
TransitionDrawable:对应标签<transition> ,在两个drawable资源之间淡入淡出切换的drawable对象。每个drawable对应一个 <item> 元素。只支持两个item。要向前转换,调用 startTransition()。要向后转换,则调用 reverseTransition()。
-
XML文件位置:res/drawable/filename.xml。
-
资源类型对象:TransitionDrawable。
-
XML标签解释:
<?xml version="1.0" encoding="utf-8"?>
<transition
xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 定义要用作可绘制对象转换一部分的可绘制对象。必须是<transition>元素的子项。接受子<bitmap>元素 -->
<item
<!-- 可绘制对象资源 -->
android:drawable="@[package:]drawable/drawable_resource"
<!-- 此可绘制对象的唯一资源ID -->
android:id="@[+][package:]id/resource_name"
<!-- 顶部偏移 -->
android:top="dimension"
<!-- 右边偏移 -->
android:right="dimension"
<!-- 底部偏移 -->
android:bottom="dimension"
<!-- 左边偏移 -->
android:left="dimension" />
</transition>
只是支持两个item。其实切换的过程也只是把哪个item显示在上面,另一个则显示在下面。可以简单的认为是上面的item把下面的item盖住了。
-
实例:
TransitionDrawable.gif
七、插入可绘制对象(InsetDrawable)
InsetDrawable :对应<inset>标签,让InsetDrawable内嵌到自己View当中,并且可以设置InsetDrawable到View边缘的边距(padding)。InsetDrawable咱们可以简单的认为就是给Drawable增加一个padding的效果。
-
XML文件位置:res/drawable/filename.xml。
-
资源类型对象:InsetDrawable。
-
XML标签解释:
<?xml version="1.0" encoding="utf-8"?>
<inset
xmlns:android="http://schemas.android.com/apk/res/android"
<!-- 可绘制对象资源 -->
android:drawable="@drawable/drawable_resource"
<!-- Drawable距离View顶部边缘的距离 -->
android:insetTop="dimension"
<!-- Drawable距离View右边边缘的距离 -->
android:insetRight="dimension"
<!-- Drawable距离View底部边缘的距离 -->
android:insetBottom="dimension"
<!-- Drawable距离View左边边缘的距离 -->
android:insetLeft="dimension" />
InsetDrawable没什么特别的,只是可以设置距离边缘的距离。
-
实例:
InsetDrawable.png
八、裁剪可绘制对象(ClipDrawable)
ClipDrawable:对应标签<clip>,根据Drawable的level等级,将指定的Drawable裁剪到一定的百分比。一定要需要配合Drawable.setLevel(0~10000)函数使用,否则无效。
-
XML文件位置:res/drawable/filename.xml。
-
资源类型对象:ClipDrawable。
-
XML标签解释:
<?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"]
<!-- 配合clipOrientation使用,指定可绘制对象中要裁剪的位置 -->
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"] />
android:gravity 参数值解释
值 | 说明 |
---|---|
top | 将对象放在其容器顶部,不改变其大小。当clipOrientation是"vertical" 时,在可绘制对象的底部裁剪。 |
bottom | 将对象放在其容器底部,不改变其大小。当 clipOrientation 是 "vertical" 时,在可绘制对象的顶部裁剪。 |
left | 将对象放在其容器左边缘,不改变其大小。这是默认值。当 clipOrientation 是 "horizontal" 时,在可绘制对象的右边裁剪。这是默认值。 |
right | 将对象放在其容器右边缘,不改变其大小。当 clipOrientation 是 "horizontal" 时,在可绘制对象的左边裁剪。 |
center_vertical | 将对象放在其容器的垂直中心,不改变其大小。裁剪行为与重力为 "center" 时相同。 |
fill_vertical | 按需要扩展对象的垂直大小,使其完全适应其容器。当 clipOrientation 是 "vertical" 时,不会进行裁剪,因为可绘制对象会填充垂直空间(除非可绘制对象级别为 0,此时它不可见)。 |
center_horizontal | 将对象放在其容器的水平中心,不改变其大小。裁剪行为与重力为 "center" 时相同。 |
fill_horizontal | 按需要扩展对象的水平大小,使其完全适应其容器。当 clipOrientation 是 "horizontal" 时,不会进行裁剪,因为可绘制对象会填充水平空间(除非可绘制对象级别为 0,此时它不可见)。 |
center | 将对象放在其容器的水平和垂直轴中心,不改变其大小。当 clipOrientation 是 "horizontal" 时,在左边和右边裁剪。当 clipOrientation 是 "vertical" 时,在顶部和底部裁剪。 |
fill | 按需要扩展对象的垂直大小,使其完全适应其容器。不会进行裁剪,因为可绘制对象会填充水平和垂直空间(除非可绘制对象级别为 0,此时它不可见)。 |
clip_vertical | 可设置为让子元素的上边缘和/或下边缘裁剪至其容器边界的附加选项。裁剪基于垂直重力:顶部重力裁剪上边缘,底部重力裁剪下边缘,任一重力不会同时裁剪两边。 |
clip_horizontal | 可设置为让子元素的左边和/或右边裁剪至其容器边界的附加选项。裁剪基于水平重力:左边重力裁剪右边缘,右边重力裁剪左边缘,任一重力不会同时裁剪两边。 |
ClipDrawable可以用来实现一些简单的进度条。
-
实例:可以实现一些简单的进度条之类的
ClipDrawable.gif
九、缩放可绘制对象(ScaleDrawable)
ScaleDrawable:对应标签<scale>,根据Drawable的level等级,将指定的Drawable缩放到一定的等级。ScaleDrawable一定要需要配合Drawable.setLevel(0~10000)函数使用,否则无效。
-
XML文件位置:res/drawable/filename.xml。
-
资源类型对象:ScaleDrawable。
-
XML标签解释:
<?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"]
<!-- 百分比。缩放高度,它是控件能够缩小的最小高度尺寸。比如:10%, 表示Drawable高度最小能缩小到控件的10%(还有90%展示出来) -->
android:scaleHeight="percentage"
<!-- 缩放宽度,它是控件能够缩小的最小宽度尺寸。比如:10%, 表示Drawable宽度最小能缩小到控件的10%(还有90%展示出来) -->
android:scaleWidth="percentage" />
注:如果Drawable.setLevel()函数的参数是0,不管android:scaleHeight和android:scaleWidth设置的是多少图片都不会显示。
值 | 说明 |
---|---|
top | 将对象放在其容器顶部,不改变其大小。 |
bottom | 将对象放在其容器底部,不改变其大小。 |
left | 将对象放在其容器左边缘,不改变其大小。这是默认值。 |
right | 将对象放在其容器右边缘,不改变其大小。 |
center_vertical | 将对象放在其容器的垂直中心,不改变其大小。 |
fill_vertical | 按需要扩展对象的垂直大小,使其完全适应其容器。 |
center_horizontal | 将对象放在其容器的水平中心,不改变其大小。 |
fill_horizontal | 按需要扩展对象的水平大小,使其完全适应其容器。 |
center | 将对象放在其容器的水平和垂直轴中心,不改变其大小。 |
fill | 按需要扩展对象的垂直大小,使其完全适应其容器。 |
clip_vertical | 可设置为让子元素的上边缘和/或下边缘裁剪至其容器边界的附加选项。裁剪基于垂直重力:顶部重力裁剪上边缘,底部重力裁剪下边缘,任一重力不会同时裁剪两边。 |
clip_horizontal | 可设置为让子元素的左边和/或右边裁剪至其容器边界的附加选项。裁剪基于水平重力:左边重力裁剪右边缘,右边重力裁剪左边缘,任一重力不会同时裁剪两边。 |
-
实例:
ScaleDrawable.gif
十、形状可绘制对象(ShapeDrawable)
ShapeDrawable:对应标签<shape>,可绘制对象资源.在Android开发过程中Shape可以用来绘制一些简单的形状或者背景.相对与Android里面其他的资源类型(png图片等)来说.Shape大大减少了安装包的大小,而且能够更好的适配不同的手机。
-
XML文件位置:res/drawable/filename.xml。
-
资源类型对象:ShapeDrawable。
-
XML标签解释:
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
<!-- 定义形状的类型 rectangle:默认形状矩形 oval:椭圆形状 line:水平线,需要<stroke>元素定义线宽 ring:环形 -->
android:shape=["rectangle" | "oval" | "line" | "ring"]
<!-- android:shape="ring"属性有效。环内部(中间的孔)的半径 -->
android:innerRadius = "integer"
<!-- android:shape="ring"属性有效 浮点型。环内部的半径,以环宽度的比率表示。如果android:innerRadiusRatio="5",则内半径等于环宽度除以5。默认值为9 -->
android:innerRadiusRatio = "float"
<!-- android:shape="ring"属性有效 环的厚度-->
android:thickness = "integer"
<!-- android:shape="ring"属性有效 浮点型。环的厚度,表示为环宽度的比率。如果android:thicknessRatio="2",则厚度等于环宽度除以2 默认9-->
android:thicknessRatio = "integer"
<!-- 只有当我们的shape使用在LevelListDrawable中的时候,这个值为true,否则为false -->
android:useLevel = "boolean"
<!-- 图像的抖动处理 -->
android:dither = "boolean"
<!-- 着色效果,有些纯色图片,如果需要显示别的颜色效果,直接加上就行,特别方便 -->
android:tint = "integer"
<!-- 用来设置shape的显示和隐藏 -->
android:visible = "integer">
<!-- 为形状产生圆角。仅当形状为矩形(android:shape="rectangle")时适用 -->
<corners
<!-- 所有角的半径 -->
android:radius="integer"
<!-- 左上角的半径 -->
android:topLeftRadius="integer"
<!-- 右上角的半径 -->
android:topRightRadius="integer"
<!-- 左下角的半径 -->
android:bottomLeftRadius="integer"
<!-- 右下角的半径 -->
android:bottomRightRadius="integer" />
<!-- 指定形状的渐变颜色 -->
<gradient
<!-- 渐变的角度(度)。0 为从左到右,90 为从上到上。必须是 45 的倍数。默认值为 0 -->
android:angle="integer"
<!-- 浮点型。渐变中心的相对 X 轴位置 (0 - 1.0) -->
android:centerX="float"
<!-- 浮点型。渐变中心的相对 Y 轴位置 (0 - 1.0) -->
android:centerY="float"
<!-- 颜色。起始颜色与结束颜色之间的可选颜色,以十六进制值或颜色资源表示 -->
android:centerColor="integer"
<!-- 颜色。结束颜色,表示为十六进制值或颜色资源 -->
android:endColor="color"
<!-- 浮点型。渐变的半径。仅在 android:type="radial" 时适用 -->
android:gradientRadius="integer"
<!-- 颜色。起始颜色,表示为十六进制值或颜色资源 -->
android:startColor="color"
<!-- 要应用的渐变图案的类型:linear:默认值线性渐变, radial:径向渐变。起始颜色为中心颜色, sweep:流线型渐变 -->
android:type=["linear" | "radial" | "sweep"]
<!-- 只有当我们的shape使用在LevelListDrawable中的时候,这个值为true,否则为false -->
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:dashGap="integer"
<!-- 描边 短划线的间距 -->
android:dashWidth="integer"/>
</shape>
当android:shape="ring"的时候,一定要小心使用android:innerRadiusRatio和android:thicknessRatio两个属性.给的值不恰当的时候可能出来的效果就不是圆环了.innerRadiusRatio:是内部空心区域的半径占控件宽度的几份之一.thicknessRatio:是圆环占控件宽度的几份之一.
如果发现shape虚线无效果的时候,可以尝试在View对应的xml里面设置android:layerType="software"
-
实例:
TransitionDrawable.png
本文实例下载链接 后续如果看到比较好的效果,我也会慢慢的往实例里面添加的。
上面所有的Drawable都会编译解析成对应的资源类型对象BitmapDrawable、LayerDrawable、ShapeDrawable等,那肯定所有XML里面能实现的功能咱们都可以在JAVA代码中通过对应的资源类型对象实现。
网友评论