Android Drawable
安卓开发中经常用到Drawable设置View的背景,那只是最基本的用法,Drawable可远不止这些,现在就来系统的学习一下Android Drawable系列。
1、Drawable
Drawable官方定义是“可以绘制的东西”的一般抽象概念。框架中有非常多的Drawable派生类,方便开发者使用:ShapeDrawable、StateListDrawable、LayerDrawable、LevelListDrawable、TransitionDrawable、InsetDrawable、ScaleDrawable、ClipDrawable等等。
Drawable系列都定义在android.graphics.drawable包中。
1.1、优点
与View不同,Drawable没有接收事件或与用户交互的任何功能。专注绘制,和Bitmap及View相比主要优点如下:
①Drawable内存占用小,绘制速度快
②Drawable有众多的派生类,且支持自定义,支持场景更丰富
③Drawable使用简单,方便快速自定义。
1.2、获取Drawable
有三种方式获取Drawable对象实例,有一些注意点:res/drawable目录下的资源会被appt工具自动优化;多个Drawable对象对应同一个res/drawable资源状态是一致的,修改其中一个其它的也会变化。参考Drawables overview。
①通过Drawable类型的构造函数
②inflate项目工程中的图片(.png、.jpg)资源:Create drawables from resource images
Resources resources = getResources();
Drawable drawable = resources.getDrawable(R.drawable.git, getTheme());③inflate定义可绘制属性的XML资源:Create drawables from XML resources
Drawable抽象类中有几个静态方法,创建Drawable对象,不过这些项目上不用,了解一下:
Drawable createFromPath(String pathName)
Drawable createFromResourceStream(Resources res, TypedValue value,InputStream is, String srcName)
Drawable createFromStream(InputStream is, String srcName)
Drawable createFromXml(Resources r,XmlPullParser parser)
Drawable createFromXml(Resources r,XmlPullParser parser,Theme theme)
Drawable createFromXmlInner(Resources r,XmlPullParser parser,AttributeSet attrs)
Drawable createFromXmlInner(Resources r,XmlPullParser parser,AttributeSet attrs,Theme theme)1.3、使用Drawable
Drawable的使用方式有很多种,用途最主要的是用来当background背景和src资源。通过代码或者xml布局的方式使用Drawable对象或资源。
①View.setBackground(Drawable background)
②View.setBackgroundDrawable(Drawable background):Deprecated
③ImageView.setImageDrawable(Drawable drawable)
1.4、常用方法介绍
①int getIntrinsicHeight():返回可绘制对象的固有高度,默认实现返回-1,即没有固有宽度
②int getIntrinsicWidth():返回可绘制对象的固有宽度,默认实现返回-1,即没有固有宽度
③setBounds(int left, int top, int right, int bottom):为Drawable指定边界矩形。调用其draw()方法时绘制的位置。
④setBounds(Rect bounds):同上
⑤boolean setVisible(boolean visible, boolean restart):设置此Drawable是否可见
⑥setTintMode(PorterDuff.Mode tintMode):着色混合模式
⑦setLayoutDirection(int layoutDirection):设置Drawable布局方向,Drawable本身无法判断方向。
2、自定义Drawable
Android的所有版本都允许Drawable类在运行时进行扩展和使用,以代替框架提供的drawable类。从API 24开始,自定义可绘制类也可以在XML中使用。
2.1、实现自定义
自定义Drawable,只需要继承Drawable抽象基类,实现其中四个抽象方法即可。
public class CustomDrawable extends Drawable {
@Override
public void draw(@NonNull Canvas canvas) {
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return 0;
}
}2.2、方法说明
①draw(Canvas canvas):根据可选效果(例如alpha(通过setAlpha设置)和滤色器(通过setColorFilter设置))绘制其边界(通过setBounds设置)。
②setAlpha(int alpha):指定可绘制对象的Alpha值。值范围0~255:0表示完全透明,而255表示完全不透明。通常将参数传给Paint
③setColorFilter(ColorFilter colorFilter):为可绘制对象指定可选的滤色器。通常将参数传给Paint
④int getOpacity():获取自定义Drawable的显示模式,只有下面四个取值,定义在PixelFormat类中,一般选用TRANSLUCENT值。
/** 未知 */
public static final int UNKNOWN = 0;
/ **系统选择支持半透明的格式(多alpha位)* /
public static final int TRANSLUCENT = -3;
/** 系统选择支持透明度的格式(至少1个Alpha位) */
public static final int TRANSPARENT = -2;
/** 系统选择不透明格式(无需Alpha位) */
public static final int OPAQUE = -1;3、框架中的各种Drawable
框架中有非常多的Drawable派生类,方便开发者使用:ShapeDrawable、StateListDrawable、LayerDrawable、LevelListDrawable、TransitionDrawable、InsetDrawable、ScaleDrawable、ClipDrawable等等。
对其中常用的一一介绍详细的使用方法,由于太多,每个一篇博客单独细说。
3.1、ShapeDrawable
ShapeDrawable详见ShapeDrawable:Android自定义背景样式Shape。
3.2、StateListDrawable
StateListDrawable详见StateListDrawable:状态Drawable。
3.3、LayerDrawable
LayerDrawable详见LayerDrawable:叠加图层。
3.4、LevelListDrawable
LevelListDrawable详见LevelListDrawable:按级别选择Drawable。
3.5、TransitionDrawable
TransitionDrawable详见TransitionDrawable:淡入淡出Drawable。
3.6、InsetDrawable
InsetDrawable详见InsetDrawable:内嵌Drawable。
3.7、ScaleDrawable*
放缩Drawable,详见官方文档Scale drawable。
<?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"]
android:scaleHeight="percentage"
android:scaleWidth="percentage" />3.8、ClipDrawable*
裁剪Drawable中定义的可绘制对象,可基于此可绘制对象的当前级别裁剪另一个Drawable。 可以根据级别控制子可绘制对象在宽度和高度上被裁剪的数量,以及重力来控制其在整个容器中的放置位置。 最常用于实现进度条之类的东西。
<?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"]
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"] />参考资料:
Android中的Drawable基础与自定义Drawable

