Drawable类型的标签有许多有用的标签,这次我们就来介绍这些标签。
1、bitmap
可以通过bitmap标签对图片做一些设置,如平铺、拉伸或保持图片原始大小,也可以指定对齐方式。
bitmap标签的属性有:
- android:src 必填,指定图片资源,只能是图片,不能是xml定义的drawable资源。
- android:gravity 设置图片的对齐方式,比如在layer-list中,默认会尽量填满整个视图,导致图片可能会被拉伸,为了避免被拉伸,就可以设置对齐方式,取值与 layout 布局中一样,作用也类似,多个取值可以用 | 分隔。该属性与tileMode是互斥的。
- android:antialias 设置是否开启抗锯齿。
- android:dither 设置是否抖动,图片与屏幕的像素配置不同时会用到,比如图片是ARGB 8888的,而屏幕是RGB565,当使用图片的dpi和屏幕不匹配时,开启图像抖动可以获得更好的显示效果。
- android:filter 设置是否允许对图片进行滤波,对图片进行收缩或者延展使用滤波可以获得平滑的外观效果。
- android:tint 给图片着色,比如图片本来是黑色的,着色后可以变成白色。有种盖一个色层在图片上的感觉。
- android:tileMode 贴图模式,设置图片平铺的方式,取值为下面四种之一:
- disable 不做任何平铺,默认设置
- repeat 图片重复铺满
- mirror 使用交替镜像的方式重复图片的绘制
- clamp 复制图片边缘的颜色来填充容器剩下的空白部分,比如引入的图片如果是白色的边缘,那么图片所在的容器里除了图片,剩下的空间都会被填充成白色
- android:alpha 设置图片的透明度,取值范围为0.0~1.0之间,0.0为全透明,1.0为全不透明,API Level最低要求是11,即Android 3.0
- android:mipMap 设置是否可以使用mipmap,但API Level最低要求是17,即Android 4.2
- android:autoMirrored 设置图片是否需要镜像反转,当布局方向是RTL,即从右到左布局时才有用,API Level 19(Android 4.4)才添加的属性
- android:tileModeX 和tileMode一样设置图片的平铺方式,只是这个属性只设置水平方向的平铺方式,这是API Level 21(Android 5.0)才添加的属性
- android:tileModeY 和tileMode一样设置图片的平铺方式,只是这个属性只设置垂直方向的平铺方式,这是API Level 21(Android 5.0)才添加的属性
- android:tintMode 着色模式,也是API Level 21(Android 5.0)才添加的属性!
这里并不是主要讲 tintMode,所以就贴张图,详细的就不提啦。
2、shape
shape 标签经常是用作根节点,所以我写的时候也会把它能嵌套的子节点标签也介绍。
使用shape可以自定义形状,可以定义下面四种类型的形状,通过android:shape属性指定:
- rectangle: 矩形,默认的形状,可以画出直角矩形、圆角矩形、弧形等
- oval: 椭圆形,用得比较多的是画正圆
- line: 线形,可以画实线和虚线
- ring: 环形,可以画环形进度条
rectangle
rectangle是默认的形状,也是用得最多的形状,一些文字背景、按钮背景、控件或布局背景等,以下是一些简单的例子:
1、solid
设置形状填充的颜色,只有android:color一个属性:
- android:color 填充的颜色
2、padding
设置内容与形状边界的内间距,可分别设置左右上下的距离:
- android:left 左内间距
- android:right 右内间距
- android:top 上内间距
- android:bottom 下内间距
3、gradient
设置形状的渐变颜色,可以是线性渐变、辐射渐变、扫描性渐变
- android:type 渐变的类型
- linear 线性渐变,默认的渐变类型
- radial 放射渐变,设置该项时,android:gradientRadius也必须设置
- sweep 扫描性渐变
- android:startColor 渐变开始的颜色
- android:endColor 渐变结束的颜色
- android:centerColor 渐变中间的颜色
- android:angle 渐变的角度,线性渐变时才有效,必须是45的倍数,0表示从左到右,90表示从下到上
- android:centerX 渐变中心的相对X坐标,放射渐变时才有效,在0.0到1.0之间,默认为0.5,表示在正中间
- android:centerY 渐变中心的相对X坐标,放射渐变时才有效,在0.0到1.0之间,默认为0.5,表示在正中间
- android:gradientRadius 渐变的半径,只有渐变类型为radial时才使用
- android:useLevel 如果为true,则可在LevelListDrawable中使用
4、corners
设置圆角,只适用于rectangle类型,可分别设置四个角不同半径的圆角,当设置的圆角半径很大时,比如200dp,就可变成弧形边了。
- android:radius 圆角半径,会被下面每个特定的圆角属性重写
- android:topLeftRadius 左上角的半径
- android:topRightRadius 右上角的半径
- android:bottomLeftRadius 左下角的半径
- android:bottomRightRadius 右下角的半径
5、stroke
设置描边,可描成实线或虚线。
- android:color 描边的颜色
- android:width 描边的宽度
- android:dashWidth 设置虚线时的横线长度
- android:dashGap 设置虚线时的横线之间的距离
这里就举一个半圆的例子,在 shape 中,绘制半圆不是用oval,用rectangle就可以啦。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#2222" />
<corners
android:bottomLeftRadius="0dp"
android:bottomRightRadius="100dp"
android:topLeftRadius="0dp"
android:topRightRadius="100dp" />
</shape>
改变矩形的两个角,当然你设置的值应该与你让这个 Drawable 附着的 View 的 width 和 height对应,这里就应该让 width = 100dp,height=200dp。
oval
oval用来画椭圆,而在实际应用中,更多是画正圆,比如消息提示,圆形按钮等,下图是一些例子:
上面的效果图应用了solid、padding、stroke、gradient、size几个特性。size是用来设置形状大小的,如下:
6、size
设置形状默认的大小,可设置宽度和高度
- android:width 宽度
- android:height 高度
数字0是默认的椭圆,只加了solid填充颜色,数字1则加了上下左右4dp的padding,后面的数字都是正圆,是通过设置size的同样大小的宽高实现的,也可以通过设置控件的宽高一致大小来实现。数字3加了描边,数字4是镂空描边,数字5是虚线描边,数字6用了radial渐变。注意,使用radial渐变时,必须指定渐变的半径,即android:gradientRadius属性。
关于矩形和圆形的 xml 代码在我的博客Android–各种Drawable介绍中有详细的例子,这里就不提了。
line
line主要用于画分割线,是通过stroke和size特性组合来实现的,先看虚线的代码:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<!-- 实际显示的线 -->
<stroke
android:width="1dp"
android:color="#2F90BD"
android:dashGap="2dp"
android:dashWidth="4dp" />
<!-- 形状的高度 -->
<size android:height="4dp" />
</shape>
画线时,有几点特性必须要知道的:
- 只能画水平线,画不了竖线;
- 线的高度是通过stroke的android:width属性设置的;
- size的android:height属性定义的是整个形状区域的高度;
- size的height必须大于stroke的width,否则,线无法显示;
- 线在整个形状区域中是居中显示的;
- 线左右两边会留有空白间距,线越粗,空白越大;
- 引用虚线的view需要添加属性android:layerType,值设为”software”,否则显示不了虚线。
ring
首先,shape根元素有些属性只适用于ring类型,先过目下这些属性吧:
- android:innerRadius 内环的半径。
- android:innerRadiusRatio 浮点型,以环的宽度比率来表示内环的半径,默认为3,表示内环半径为环的宽度除以3,该值会被 android:innerRadius 覆盖。
- android:thickness 环的厚度。
- android:thicknessRatio 浮点型,以环的宽度比率来表示环的厚度,默认为9,表示环的厚度为环的宽度除以9,该值会被android:thickness覆盖。
- android:useLevel 一般为false,否则可能环形无法显示,只有作为LevelListDrawable使用时才设为true。
第一个图只添加了solid;第二个图只添加了gradient,类型为sweep;第三个图只添加了stroke;第四个图添加了gradient和stroke两项特性。
用第四个图为例,如果想让这个环形旋转起来,变成可用的进度条,则只要在shape外层包多一个rotate元素就可以了。
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="1080.0">
<shape
android:innerRadiusRatio="3"
android:shape="ring"
android:thicknessRatio="8"
android:useLevel="false">
<gradient
android:endColor="#2F90BD"
android:startColor="#FFFFFF"
android:type="sweep" />
</shape>
</rotate>
3、layer-list
使用layer-list可以将多个drawable按照顺序层叠在一起显示,像上图中的Tab,是由一个红色的层加一个白色的层叠在一起显示的结果,阴影的圆角矩形则是由一个灰色的圆角矩形叠加上一个白色的圆角矩形。先看下代码吧,以下是Tab背景的代码:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<layer-list>
<!-- 红色背景 -->
<item>
<color android:color="#E4007F" />
</item>
<!-- 白色背景 -->
<item android:bottom="4dp" android:drawable="@android:color/white" />
</layer-list>
</item>
<item>
<layer-list>
<!-- 红色背景 -->
<item>
<color android:color="#E4007F" />
</item>
<!-- 白色背景 -->
<item android:bottom="1dp" android:drawable="@android:color/white" />
</layer-list>
</item>
</selector>
然后是阴影圆角的代码:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 灰色阴影 -->
<item
android:left="2dp"
android:top="4dp">
<shape>
<solid android:color="@android:color/darker_gray" />
<corners android:radius="10dp" />
</shape>
</item>
<!-- 白色前景 -->
<item
android:bottom="4dp"
android:right="2dp">
<shape>
<solid android:color="#FFFFFF" />
<corners android:radius="10dp" />
</shape>
</item>
</layer-list>
从上面的示例代码可以看到,layer-list可以作为根节点,也可以作为selector中 item 的子节点。layer-list可以添加多个item子节点,每个item子节点对应一个drawable资源,按照item从上到下的顺序叠加在一起,再通过设置每个item的偏移量就可以看到阴影等效果了。layer-list的item可以通过下面四个属性设置偏移量:
- android:top 顶部的偏移量
- android:bottom 底部的偏移量
- android:left 左边的偏移量
- android:right 右边的偏移量
这四个偏移量和控件的 margin 设置差不多,都是外间距的效果。如何不设置偏移量,前面的图层就完全挡住了后面的图层,从而也看不到后面的图层效果了。比如上面的例子,Tab背景中的白色背景设置了android:bottom之后才能看到一点红色背景。如果偏移量设为负值,偏移超出的部分会被截掉而看不到。
另外,关于item的用法,也做下总结:
根节点不同时,可设置的属性是会不同的,比如selector下,可以设置一些状态属性,而在layer-list下,可以设置偏移量。
就算父节点同样是selector,放在drawable目录和放在color目录下可用的属性也会不同,比如drawable目录下可用的属性为android:drawable,在color目录下可用的属性为android:color。
item的子节点可以为任何类型的drawable类标签,除了上面例子中的shape、color、layer-list,也可以是selector和其它的。
4、nine-patch
使用nine-patch标签可以对点九图片做一些设置处理,不过可设置的属性并不多:
- android:src 必填项,必须指定点九类型的图片
- android:dither 设置是否抖动,图片与屏幕的像素配置不同时会用到,比如图片是ARGB 8888的,而屏幕是RGB565
- android:tint 给图片着色,比如图片本来是黑色的,着色后可以变成白色
- android:tintMode 着色模式
- android:alpha 设置图片的透明度,取值范围为0.0~1.0之间,0.0为全透明,1.0为全不透明,API Level最低要求是11
- android:autoMirrored 设置图片是否需要镜像反转,当布局方向是RTL,即从右到左布局时才有用,API Level19(Android 4.4)才添加的属性
5、color
color标签在 drawable 里很简单,只有一个属性:android:color,指定颜色值。这个标签一般很少用,因为基本都可以通过其他更方便的方式定义颜色。另外,颜色值一般都在colors.xml文件中定义,其根节点为resources。
<!-- res/drawable/white.xml -->
<color xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#FFFFFF" />
<!-- res/values/colors.xml -->
<resources>
<color name="white">#FFFFFF</color>
</resources>
引用的时候,前一种通过@drawable/white引用,后一种通过@color/white引用。
6、inset
使用inset标签可以对drawable设置边距,其用法和View的padding类似,只不过padding是设置内容与边界的距离,而inset则可以设置背景drawable与View边界的距离。inset标签的可设置属性如下:
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
- android:visible 设置初始的可见性状态,默认为false
- android:insetLeft 左边距
- android:insetRight 右边距
- android:insetTop 顶部边距
- android:insetBottom 底部边距
- android:inset 设置统一边距,会覆盖上面四个属性,但API Level要求为21,即Android 5.0
7、clip
使用clip标签可以对drawable进行裁剪,在做进度条时很有用。通过设置level值控制裁剪多少,level取值范围为0~10000,默认为0,表示完全裁剪,图片将不可见;10000则完全不裁剪,可见完整图片。看看clip标签可以设置的属性:
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
- android:clipOrientation 设置裁剪的方向,取值为以下两个值之一:
- horizontal 在水平方向上进行裁剪,条状的进度条就是水平方向的裁剪
- vertical 在垂直方向上进行裁剪
- android:gravity 设置裁剪的位置,可取值如下,多个取值用 | 分隔:
8、scale
使用scale标签可以对drawable进行缩放操作,和clip一样是通过设置level来控制缩放的比例。scale标签可以设置的属性如下:
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签。
- android:scaleHeight 设置可缩放的高度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半。
- android:scaleWidth 设置可缩放的宽度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半。
- android:scaleGravity设置drawable缩放后的位置,取值和bitmap标签的一样,就不一一列举说明了,不过默认值是left。
- android:useIntrinsicSizeAsMinimum设置drawable原有尺寸作为最小尺寸,设为true时,缩放基本无效,API Level最低要求为11。
9、level-list
当需要在一个View中显示不同图片的时候,比如手机剩余电量不同时显示的图片不同,level-list就可以派上用场了。level-list可以管理一组drawable,每个drawable设置一组level范围,最终会根据level值选取对应的drawable绘制出来。level-list通过添加item子标签来添加相应的drawable,其下的item只有三个属性:
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
- android:minLevel 该item的最小level值
- android:maxLevel 该item的最大level值
10、transtion
transition其实是继承自layer-list的,只是,transition只能管理两层drawable,另外提供了两层drawable之间切换的方法,切换时还会有淡入淡出的动画效果。我在博客Android–各种Drawable介绍有详细介绍,我就不重复说这些内容啦。
11、rotate
这个就介绍下属性吧:
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签。
- android:fromDegrees 起始的角度度数。
- android:toDegrees 结束的角度度数,正数表示顺时针,负数表示逆时针。
- android:pivotX 旋转中心的X坐标,浮点数或是百分比。浮点数表示相对于drawable的左边缘距离单位为px,如5;百分比表示相对于drawable的左边缘距离按百分比计算,如5%; 另一种百分比表示相对于父容器的左边缘,如5%p; 一般设置为50%表示在drawable中心。
- android:pivotY 旋转中心的Y坐标。
- android:visible 设置初始的可见性状态,默认为false。
12、animation-list
通过animation-list可以将一系列drawable构建成帧动画,就是将一个个drawable,一帧一帧的播放。通过添加item子标签设置每一帧使用的drawable资源,以及每一帧持续的时间。示例代码可看我的这篇博客Android–各种Drawable介绍。
- android:oneshot属性设置是否循环播放,设为true时,只播放一轮就结束,设为false时,则会轮询播放。
- android:duration属性设置该帧持续的时间,以毫秒数为单位。
animation-list对应的Drawable类为AnimationDrawable,要让动画运行起来,需要主动调用AnimationDrawable的start()方法。另外,如果在Activity的onCreate()方法里直接调用start()方法会没有效果,因为view还没有初始化完成是播放不了动画的。
13、animated-rotate
rotate标签只是将原有的drawable转个角度变成另一个drawable,它是静态的。而animated-rotate则会让drawable不停地做旋转动画。
animated-rotate可设置的属性只有四个:
- android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
- android:pivotX 旋转中心的X坐标
- android:pivotY 旋转中心的Y坐标
- android:visible 设置初始的可见性状态,默认为false
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/img_daisy"
android:pivotX="50%"
android:pivotY="50%"
android:visible="false" />
14、animated-selector
Animated-selector是基于状态的。根据View的状态(比如选中与激活状态),selector将使用提供的Transition来过渡到正确的状态。
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/pressed"
android:drawable="@drawable/wifi_100"
android:state_activated="true" />
<item
android:id="@+id/normal"
android:drawable="@drawable/wifi_0" />
<transition
android:fromId="@+id/normal"
android:toId="@+id/pressed">
<animation-list>
<item
android:drawable="@drawable/wifi_0"
android:duration="500" />
<item
android:drawable="@drawable/wifi_30"
android:duration="500" />
<item
android:drawable="@drawable/wifi_50"
android:duration="500" />
<item
android:drawable="@drawable/wifi_70"
android:duration="500" />
<item
android:drawable="@drawable/wifi_100"
android:duration="500" />
</animation-list>
</transition>
<transition
android:fromId="@+id/pressed"
android:toId="@+id/normal">
<animation-list>
<item
android:drawable="@drawable/wifi_100"
android:duration="500" />
<item
android:drawable="@drawable/wifi_70"
android:duration="500" />
<item
android:drawable="@drawable/wifi_50"
android:duration="500" />
<item
android:drawable="@drawable/wifi_30"
android:duration="500" />
<item
android:drawable="@drawable/wifi_0"
android:duration="500" />
</animation-list>
</transition>
</animated-selector>
<ImageView
android:clickable="true"
android:id="@+id/iv1"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:background="@drawable/animated"
android:layout_width="200dp"
android:layout_height="200dp" />
当使用Animated-selector的时候,动画将在状态条件满足selector的时候被触发。在我们这个简单的例子中,我们为 ImageView 添加一个监听器:
ImageView imageView = (ImageView) findViewById(R.id.iv1);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imageView.setActivated(!imageView.isActivated());
}
});
当用户点击WIFI图标,它将会根据当前的状态在零格与满格之间切换。
15、ripple
ripple标签可以给我们的 View 添加上涟漪效果,会让我们的 UI 感觉焕然一新。
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#ffff0000">
<item android:id="@android:id/mask"
android:drawable="@android:color/white" />
</ripple>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#ffff0000">
<item> // 这个item中包含drawable资源
<shape
android:shape="oval">
<solid android:color="@android:color/holo_blue_bright" />
</shape>
</item>
</ripple>
结束语:本文仅用来学习记录,参考查阅。