概述
Drawable资源是Android应用中使用最广泛的资源,它不仅可以使用各种格式的图片资源,也可以使用多种xml文件资源。
1.一种可以在Canvas上进行绘制的抽象的概念;
2.颜色、图片等都可以是一个Drawable;
3.Drawable可以通过XML定义,或者通过代码创建;
4.Android中Drawable是一个抽象类,每个具体的Drawable都是其子类;
Drawable的分类
Drawable的子类包括ColorDrawable、GradientDrawable、BitmapDrawable、NinePatchDrawable、InsetDrawable、ClipDrawable、ScaleDrawable、RotateDrawable、AnimationDrawable、LayerDrawable、StateListDrawable、TransitionDrawable、VectorDrawable、ShapeDrawable
1.ColorDrawable
A specialized Drawable that fills the Canvas with a specified color.
ColorDrawable是最简单的Drawable,也是平时用的最多的,比如:
android:background = "@color/colorAccent"
ColorDrawable是一个专门用来使用指定的颜色来填充画布的Drawable,当它被绘制到画布上时会使用一种指定的颜色填充Paint,在画布上绘制出一块单色区域。
在xml文件中使用color作为根节点来创建ColorDrawable,它只有一个android:color属性,通过它来决定ColorDrawable的颜色,这个颜色一旦设置之后,就不能直接修改了。
<?xml version="1.0" encoding="utf-8"?>
<color xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#ff000000"
/>
通过java代码也可以创建ColorDrawable,代码如下:
ColorDrawable drawable = new ColorDrawable(0xff000000);
2.BitmapDrawable
A Drawable that wraps a bitmap and can be tiled, stretched, or aligned.
BitmapDrawable是对bitmap的一种包装,可以设置它包装的bitmap在BitmapDrawable区域内的绘制方式,如平铺、拉伸填充或者保持图片原始尺寸,也可以在BitmapDrawable区域内部使用gravity指定的对齐方式。
在xml文件中使用bitmap作为根节点来定义BitmapDrawable。
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/arrow_down"
android:tileMode="mirror"
android:antialias="true"
android:dither="true"
/>
其中,src为引用的图片资源;tileMode属性表示平铺模式,一共有4中属性:mirror,repeat,clamp,disabled;dither属性表示是否开启抖动,一般为true;antialias属性表示是否开启抗锯齿功能,一般为true;
也可以使用java代码实现上述相同的效果,等价的java代码如下:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.arrow_down);
BitmapDrawable mBitmapDrawable = new BitmapDrawable(bitmap);
mBitmapDrawable.setTileModeXY(TileMode.MIRROR,TileMode.MIRROR);
mBitmapDrawable.setAntiAlias(true);
mBitmapDrawable.setDither(true);
mDrawable = mBitmapDrawable;
3.GradientDrawable
A Drawable with a color gradient for buttons, backgrounds, etc.
GradientDrawable表示一个渐变区域,可以实现线性渐变、发散渐变和平铺渐变效果;
在xml文件中使用shape作为根节点来创建GradientDrawable,它包含很多属性和子节点,具体如下:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle | oval | ring | line">
// 矩形
//内部填充色
<solid android:color="@color/red" />
//圆角半径
<corners android:radius="5dp" />
//边框颜色和宽度
<stroke android:color="@color/orange" android:width="5dp" />
//渐变色
<gradient
android:angle="integer" //渐变角度(默认为0,即从左到右),须为45的倍数,为0时从左到右
//为90时从上到下,该属性仅对线性渐变有效
android:centerX="integer" //渐变中心X的相对位置,范围从0~1
android:centerY="integer" //渐变中心Y的相对位置,范围从0~1
android:startColor="color" //颜色渐变的开始颜色
android:centerColor="integer" //颜色渐变的中心颜色
android:endColor="color" //颜色渐变的结束颜色
android:gradientRadius="integer" //渐变半径,只有当type为radial时才能使用
android:type=["linear" | "radial" | "sweep"] //默认值为linear,即线性渐变,radial(放射性渐变),sweep(扫描式渐变)
android:useLevel=["true" | "false"] //设置为false才有渐变效果
/>
//指定大小
<size android:width="45dp" android:height="45dp" />
//内边距
<padding
android:left="5dp" android:top="5dp"
android:right="5dp" android:bottom="5dp" />
4.ScaleDrawable
ScaleDrawable是对一个Drawable进行缩放操作,可以根据level属性控制这个drawable的缩放比例,也可以设置它在容器中的对齐方式。在xml文件中使用scale作为根节点来创建RotateDrawable,创建ScaleDrawable的代码如下: