玩转Android之Drawable的使用
1.概述
用过Drawable的都知道Drawable有很多种,有的时候Drawable是一张图片,有的时候Drawable是我们通过颜色构造出来的某种图形。
最常见的自己构造的Drawable图形莫过于ShapeDrawable,我们在开发中可能经常需要自己绘制一个矩形、圆形、椭圆等等各种各样的图形。
一般来说,Drawable并没大小的概念(虽然可以通过getIntrinsicHeight和getIntrinsicWidth两个方法获取Drawable的宽和高,但是这两个方法并不总是有效,因为如果我们的Drawable是图片的话,那么Drawable的大小就是图片的大小,如果我们的Drawable本身就是颜色的话,那么就没有宽高的概念)
因为我们在用Drawable的时候,大多数时候都是把它当作某一个控件的背景来使用的,此时Drawable会被拉伸到和View相同的大小,此时Drawable的大小实际上就是控件的大小。
2.在Drawable的这些继承类中我们常用的主要有以下几种:
1. LayerDrawable
2. ShapeDrawable
3. NinePatchDrawable
4. BitmapDrawable
5. StateListDrawable
6. LevelListDrawable
7. TransitionDrawable
8. InsetDrawable
9. ScaleDrawable
10.ClipDrawable
3.Drawable介绍:
3.1.BitmapDrawable
BitmapDrawable的构造,除了在代码中new一个BitmaDrawable之外,我们还可以使用XML来构造一个BitmapDrawable对象,在项目的drawable文件中新创建一个xml文件,代码如下:
示例:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:antialias="true"
android:src="@drawable/a2w"
android:dither="true"
android:filter="true"
android:gravity="top|left"
android:tileMode="mirror"
>
</bitmap>
属性:
- src 要显示的图片(必需)
- antialias 是否开启抗锯齿,在自定义View创建Paint时经常用到
- dither 是否开启抖动效果,作用是手机像素配置和图片像素配置不一致时,系统会自动调整显示效果
- filter 是否开启过滤效果,这个属性也是为了使图片被放大或者缩小时有一个较好的显示效果
- gravity 表示当图片的大小小于控件的大小时,图片的显示位置
- tileMode 表示平铺模式,在我们的Windows电脑桌面设置的时候就有这个选项,该属性共有四种取值,分别是disable、repeat、mirror、clamp四种,默认情况下是disable,就是不做任何处理,当我们在这里使用了除disable之外的另外三种取值时,gravity属性值失效。
3.2.ShapeDrawable
shape是一个根节点;在shape中写其他样式
示例:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle|oval|line|ring" >
<shape>
属性:
- android:shape 四种形状:rectangle(矩形,包括正方形),oval(椭圆,包括圆),line(线段),ring(环形),默认长方形
- android:innerRadius:内环的半径。
- android:innerRadiusRatio:内环的比例,比如这个值为2,那么内环的半径就为环半径除以2,如果设置了innerRadius,则这个属性不起作用。
- android:thickness:环的厚度。
- android:thicknessRatio:环的厚度比例,比如这个值为2,那么环的厚度就为环半径除以2,如果设置了thickness,则这个属性不起作用。
- android:useLevel:当shape为ring才有效,表示是否允许根据level来显示环的一部分
- android:visible 设置是否可见
圆角:
android:radius表示长方形四个角的半径,当然也可以每个角单独设定,后面单独设定的圆角半径会覆盖android:radius。
<corners
android:radius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp"
android:bottomLeftRadius="0dp"
android:bottomRightRadius="0dp"/>
渐变:
<gradient
android:angle="90"
android:centerColor="#9ACD32"
android:endColor="#9AC0CD"
android:startColor="#9AFF9A"
android:type="linear"
android:useLevel="false" />
- android:angle 表示渐变的起始位置,只有linear类型的渐变才有效,表示渐变角度,这个值必须为45的倍数,包括0,0表示从左往右渐变,逆时针旋转,依次是45,90,135…,90表示从下往上渐变,270表示从上往下渐变。
- android:startColor 表示渐变的起始颜色
- android:centerColor 表示渐变的过渡颜色
- android:endColor 表示渐变的结束颜色
- type表示渐变的类型,有三种,分别是linear(线性变化),radial(辐射渐变),sweep(平铺渐变)
- android:gradientRadius 只有radial和sweep类型的渐变才有效,radial必须设置,表示渐变效果的半径
- centerX:渐变中间亚瑟的x坐标,取值范围为:0~1
- centerY:渐变中间颜色的Y坐标,取值范围为:0~1
- android:useLevel 判断是否根据level绘制渐变效果
填充:
背景填充色,设置solid后会覆盖gradient(渐变)设置的所有效果!!!
<solid android:color="#ADFF2F" />
描边:
<stroke
android:width="1dp"
android:color="#FFFF00"
android:dashWidth="15dp"
android:dashGap="5dp"/>
- android:dashWidth 表示虚线的宽度
- android:dashGap 表示虚线之间的间隔
- 以上两个属性如果不设置则为实线
- android:width 边框的宽度
- android:color 边框的颜色
大小:
这个表示该shape的大小,默认情况下,shape的大小与它所在的容器大小成正比。如果我们在ImageView中使用这个shape,那么可以通过android:scaleType="center"属性来限制这种缩放
<size
android:width="1dp"
android:height="1dp"/>
填充:
left,top,right,bottm:依次是左上右下方向上的边距!
<padding android:bottom="" android:left="" android:right="" android:top=""/>
3.3.LayerDrawable
LayerDrawable中可以有n多个item,每个item就是一个Drawable,每一个Drawable依据代码的顺序相互覆盖着显示出来。先写的先绘制,后写的后绘制,最终显示的效果是一个叠加的显示效果
示例:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/lineColor"/>
</shape>
</item>
<item android:bottom="8dp">
<shape android:shape="rectangle">
<solid android:color="@color/lineColor2"/>
</shape>
</item>
<item android:bottom="1dp" android:left="1dp" android:right="1dp">
<shape android:shape="rectangle">
<solid android:color="@color/etbg"/>
</shape>
</item>
</layer-list>
3.4.LevelListDrawable
LevelListDrawable,顾名思义就是一个等级Drawable,它就是根据控件的不同等级来切换Drawable,有点类似于selector中的根据控件的状态来更新Drawable。不同的是这里是根据控件的level来更新。状态改变用法类似于:setImageLevel(5);level的取值范围为0~10000,默认值为0。
示例:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/p2"
android:minLevel="0"
android:maxLevel="10"/>
<item
android:drawable="@drawable/p1"
android:minLevel="11"
android:maxLevel="20"/>
</level-list>
3.5.TransitonDrawable
TransitionDrawable主要是实现两个Drawable之间淡入淡出的效果。
类似用法:
TransitionDrawable drawable = (TransitionDrawable) iv.getDrawable();
drawable.startTransition(2000);
示例:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/p1"/>
<item android:drawable="@drawable/p2"/>
</transition>
3.6.InsetDrawable
InsetDrawable表示可以将一个Drawable嵌入到自己当中。类似的效果使用LayerDrawable也能实现
示例:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetBottom="20dp"
android:insetLeft="20dp"
android:insetRight="20dp"
android:insetTop="20dp">
<shape android:shape="oval">
<solid android:color="@color/colorAccent"/>
</shape>
</inset>
3.7.ClipDrawable
表示根据一个Drawable的level对Drawable进行剪裁
示例:
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/p1"
android:clipOrientation="horizontal"
android:gravity="left">
</clip>
属性:
- drawable表示drawable图像,
- clipOrientation表示剪裁的方向,是从水平方向剪裁还是从垂直方向剪裁,这个属性配合gravity属性才会生效,至于每次剪裁的百分比则是和level属性的值有关,level属性的取值范围为0~10000,0表示完全剪裁,10000表示完全不剪裁,5000则表示剪裁一般,其它值依此类推。