Drawable分类
1.BitmapDrawable
一般开发中直接引用图片即可,但也可以通过XML的方式来描述它,可以设置更多的效果。
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:antialias="true"
android:dither="true"
android:gravity="center"
android:mipMap="true"
android:filter="true"
android:src="@drawable/ic_launcher"
android:tileMode="disabled" >
</bitmap>
android:antialias
是否开启抗锯齿。开启使图片变得平滑。
android:dither
是否开启抖动效果。让高质量的图片在低质量的屏幕上还能保持较好的显示效果。
android:filter
是否开启过滤效果。图片尺寸被拉伸或压缩时,可以保持较好的显示效果。
android:mipMap(mipMap在API18以上)
纹理映射。图像相关的处理技术,不常用。
android:tileMode
平铺模式。[“disabled”|”clamp”|”repeat”|”mirror”],disabled:关闭平铺模式,开启平铺后android:gravity属性会被忽略。repeat:水平和竖直方向的平铺,mirror:水平和竖直方向镜面投影效果,clamp:图片四周的图像会扩展到周围区域。
repeat
mirror
NinePathDrawable
表示一张.9图。
<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
android:dither="true"
android:src="@drawable/ic_launcher" >
</nine-patch>
ShapeDrawable
通过颜色来构造图形,即可是纯色,也可是渐变效果。
LayerDrawable
对应xml标签是,表示一种层次化的Drawable集合。
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 连框颜色值 -->
<item
android:bottom="0dp"
android:left="0dp"
android:right="1dp"
android:top="0dp">
<shape>
<corners android:radius="3dp" />
<gradient
android:angle="270"
android:endColor="#FFFFFF"
android:startColor="#EEEEEE" />
</shape>
</item>
<!-- 主体背景颜色值 -->
<item
android:bottom="0dp"
android:left="0dp"
android:right="0dp"
android:top="0dp">
<shape>
<corners android:radius="3dp" />
<stroke
android:width="1dp"
android:color="#E8E9E9" />
</shape>
</item>
</layer-list>
StateListDrawable
对应标签
LeverListDrawable
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/garland_gray"
android:maxLevel="0" />
<item
android:drawable="@drawable/garland_yellow"
android:maxLevel="1" />
<item
android:drawable="@drawable/garland_blue"
android:maxLevel="2" />
</level-list>
通过下边代码设置选中对应等级的Drawable。
imageView.getDrawable().setLevel(1);
TransitionDrawable
对应标签。用于实现两个Drawable之间的淡入淡出效果
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/edge_green"/>
<item android:drawable="@drawable/edge_purple"/>
</transition>
通过下边代码设置
TransitionDrawable drawable = (TransitionDrawable) tv.getBackground();
drawable.startTransition(5000);//开启效果
drawable.reverseTransition(5000);//逆过程
InsetDrawable
对应标签
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetBottom="15dp"
android:insetLeft="15dp"
android:insetRight="15dp"
android:insetTop="15dp" >
<shape android:shape="rectangle" >
<solid android:color="#ff0000" />
</shape>
</inset>
ScaleDrawable
对应标签,可以根据自己的等级(level)将指定的Drawable缩放到一定比例。
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_launcher"
android:scaleGravity="center"
android:scaleHeight="25%"
android:scaleWidth="25%" >
</scale>
但是直接使用上面的Drawable资源是不行的,必须设置ScaleDrawable的等级0-10000之间的值,如下:
ScaleDrawable scaleDrawable = (ScaleDrawable) view.getBackground();
scaleDrawable.setLevel(1);
ClipDrawable
对应标签,根据自己当前等级来裁剪另一个Drawable。
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="vertical"
android:drawable="@drawable/ic_launcher"
android:gravity="bottom" >
</clip>
裁剪方向通过android:clipOrientation和android:gravity共同控制。上边表示从上往下竖直裁剪。
ClipDrawable clipDrawable=(ClipDrawable) iv.getDrawable();
clipDrawable.setLevel(5000);
level从0-10000,0表示完全裁剪,10000表示不裁剪,5000表示裁剪一半。
自定义Drawable
public class CustomDrawable extends Drawable {
private Paint mPaint;
public CustomDrawable(int color) {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(color);
}
@Override
public void draw(Canvas canvas) {
Rect r = getBounds();
float cX = r.exactCenterX();
float cY = r.exactCenterY();
canvas.drawCircle(cX, cY, Math.min(cX, cY), mPaint);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
invalidateSelf();
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
invalidateSelf();
}
}