Drawable表示的是一个可以在Canvas上进行绘制的抽象概念,他的种类有很多,最常见的颜色和图片都是一个Drawable.
Drawable的内部宽/高这个参数,通过getIntrinsicWidth和getIntrinsicHeigth这两个方法获得.
BitmapDrawable
表示的是一张图片,可以引用原始的图片也可以通过XML方式描述他
<?xml version="1.0" encoding="utf-8"?>
<bitmap / nine-patch
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:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
android:antialias:是否开启图片抗锯齿功能。开启后会让图片变得平滑,同时也会一定程度上降低图片的清晰度,建议开启;
android:dither:是否开启抖动效果。当图片的像素配置和手机屏幕像素配置不一致时,开启这个选项可以让高质量的图片在低质量的屏幕上还能保持较好的显示效果,建议开启。
android:filter:是否开启过滤效果。当图片尺寸被拉伸或压缩时,开启过滤效果可以保持较好的显示效果,建议开启;
android:gravity:当图片小于容器的尺寸时,设置此选项可以对图片进行定位。
android:tileMode:平铺模式,有四种选项[“disabled” | “clamp” | “repeat” | “mirror”]。当开启平铺模式后,gravity属性会被忽略。repeat是指水平和竖直方向上的平铺效果;mirror是指在水平和竖直方向上的镜面投影效果;clamp是指图片四周的像素会扩展到周围区域,这个比较特别。
NinePatchDrawable
表示的是一张.9格式的图片,可以直接引用或者通过XML文件来描述.
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 //当shape为rectangle时使用
android:radius="integer" //半径值会被后面的单个半径属性覆盖,默认为1dp
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer" />
<gradient //渐变与solid互斥的
android:angle="integer" //渐变的角度,默认为0,值必须是45的倍数
android:centerX="integer" //渐变中心点的横坐标
android:centerY="integer"
android:centerColor="integer" //渐变中心色
android:endColor="color" //渐变结束色
android:gradientRadius="integer" //渐变半径 android:tye="radial"设置时有效
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 //指定大小,一般用在imageview配合scaleType属性使用
android:width="integer"
android:height="integer" />
<solid //填充颜色
android:color="color" />
<stroke //边框
android:width="integer" //描边宽度
android:color="color" //描边颜色
android:dashWidth="integer" //虚线段的宽度
android:dashGap="integer" /> //虚线段之间的间隔
</shape>
LayerDrawable
对应XML标签是<layer-list>
,表示一种层次化的Drawable集合
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/res_haimei1"
android:bottom="10dp"
android:drawable="@drawable/untitled"
android:left="10dp"
android:right="10dp"
android:top="10dp" />
<item
android:id="@+id/res_icon"
android:width="30dp"
android:height="30dp"
android:drawable="@mipmap/ic_launcher"
android:gravity="center" />
</layer-list>
StateListDrawable
对应<selector>
标签,表示Drawable集合,每个Drawable都对应着View的一种状态,例如常用的选择器就是这个.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize="false" //固有大小书否不随着其状态的改变而改变
android:dither="true" //抖动
android:variablePadding="false">
<item android:drawable="@mipmap/ic_launcher" android:state_pressed="true" />
<item android:drawable="@mipmap/haimei1" android:state_pressed="false" />
</selector>
LevelListDrawable
对应<level-list>
标签,表示一个Drawable集合,集中的每个Drawable都有一个等级概念,会根据不同的等级切换对应的Drawable. Level等级默认值1-10000
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/untitled"
android:maxLevel="10"
android:minLevel="5"
/>
<item
android:drawable="@drawable/untitled"
android:maxLevel="100"
android:minLevel="20"
/>
</level-list>
最后可以在JAVA代码中设置 imageView.setLever的方法设置不同的等级从而切换具体的Drawable
TrasitionDrawable
对应<transition>
标签用于实现2个Drawable之间淡入淡出的效果
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/mitmao1" />
<item android:drawable="@mipmap/mitmao2" />
</transition>
Java代码中设置
TransitionDrawable drawable = (TransitionDrawable) imageView.getBackground();
drawable.startTransition(1000);//设置渐变的时间 单位是毫秒
drawable.resetTransition(5000);//变回原样子
InsetDrawable
对应<inset>
标签,可以将其他的Drawable内嵌到自己当中,并可以在四周留出一定的间隙. 类似于Pandding
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@mipmap/mitmap"
android:insetBottom="10dp"
android:insetLeft="10dp"
android:insetRight="10dp"
android:insetTop="10dp">
<shape android:shape="rectangle">
<solid android:color="#abcdef" />
</shape>
</inset>
ScaleDrawable
对应<scale>
标签,他可以根据自己的等级Level 将指定的Drawable缩放到一定的比例
下面的代码就是将一张图片做小为原大小的30%
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@mipmap/haimei2"
android:scaleGravity="center"
android:scaleHeight="70%"
android:scaleWidth="70%">
</scale>
//最后还需要在JAVA代码中设置ScaleDrawable的等级大于0且小于10000的值才可以
ScaleDrawable scaleDrawable = (ScaleDrawable) imageView.getBackground();
caleDrawable.setLevel(1);
ClipDrawable
对应<clip>
标签,他可以根据自己当前的等级来裁剪另一个Drawable.标签中可以设置一个cilpOrientation 表示剪裁方向,
<!-- 此标签表示从左右同时剪裁 -->
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="horizontal"
android:drawable="@mipmap/mitmap"
android:gravity="center">
</clip>
//需在JAVA代码中设置等级,0-10000 0表示完全剪裁 10000表示不剪裁.
ClipDrawable clipDrawable = (ClipDrawable) ivLevei.getBackground();
clipDrawable.setLevel(7000);
自定义Drawable
重头戏~来了~~ 自定义Drawable
其实用法比较单一,一般就是InageView中的图像显示,要不就是View中的背景图了. 我们可以重写Drawable的draw方法来自定义Drawable.
下面的例子是自定义Drawable绘制一个圆形
public class CustomDrawable extends Drawable {
private Paint mPaint;
//通过构造函数来设置画笔的颜色
public CustomDrawable(int color) {
mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(color);
}
/**
* @param canvas
* 横坐标
* 纵坐标
* 半径
* 画笔
*/
@Override
public void draw(Canvas canvas) {
final Rect rect=getBounds();
float cx=rect.exactCenterX();
float cy=rect.exactCenterY();
//绘制圆形
canvas.drawCircle(cx,cy,Math.min(cx,cy),mPaint);
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
invalidateSelf();
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
invalidateSelf();
}
@Override
public int getOpacity() {
//系统默认,支持和窗口一样的透明度
return PixelFormat.TRANSLUCENT;
}
//返回实际的长和宽
@Override
public int getIntrinsicHeight() {
return super.getIntrinsicHeight();
}
@Override
public int getIntrinsicWidth() {
return super.getIntrinsicWidth();
}
}
//最后在Activity中添加CustomDrawable
imageView.setImageDrawable(new CustomDrawable(Color.GREEN));
好了,关于Drawable就分析到这里了,如果有朋友有什么问题可以评论,我们一起探讨一下.