您的位置:首页 > 其它

ShapeDrawable

2016-04-01 13:45 267 查看
ShapeDrawable 用于绘制各种形状,使用 Shape 类来绘图。

Shape 类只负责 drawable 的形状和大小,颜色(材质 Shader) 以及 bounds 仍由 ShapeDrawable 本身管理。

Shape 类的主要方法和属性:

public abstract class Shape implements Cloneable {
private float mWidth;
private float mHeight;
   public abstract void draw(Canvas canvas, Paint paint);
public final void resize(float width, float height) {
//...
}
protected void onResize(float width, float height) {}
}
保存高宽,外部访问 resize,内部回调 onResize。



实现类 RectShape :

ublic class RectShape extends Shape {
private RectF mRect = new RectF();

@Override
public void draw(Canvas canvas, Paint paint) {
canvas.drawRect(mRect, paint);
}

@Override
protected void onResize(float width, float height) {
mRect.set(0, 0, width, height);
}

protected final RectF rect() {
return mRect;
}
}


实现类 OvalShape:

public class OvalShape extends RectShape {
@Override
public void draw(Canvas canvas, Paint paint) {
canvas.drawOval(rect(), paint);
}
}
其他 Shape 实现类也是类似的。

ShapeDrawable 通过 onDraw 函数把绘图的任务交给了 Shape 类:

@Override
public void draw(Canvas canvas) {
final Rect r = getBounds();
final ShapeState state = mShapeState;
final Paint paint = state.mPaint;

final int prevAlpha = paint.getAlpha();
paint.setAlpha(modulateAlpha(prevAlpha, state.mAlpha));

// only draw shape if it may affect output
if (paint.getAlpha() != 0 || paint.getXfermode() != null || paint.hasShadowLayer()) {
final boolean clearColorFilter;
if (mTintFilter != null && paint.getColorFilter() == null) {
paint.setColorFilter(mTintFilter);
clearColorFilter = true;
} else {
clearColorFilter = false;
}

if (state.mShape != null) {
// need the save both for the translate, and for the (unknown)
// Shape
final int count = canvas.save();
canvas.translate(r.left, r.top);
onDraw(state.mShape, canvas, paint);
canvas.restoreToCount(count);
} else {
canvas.drawRect(r, paint);
}

if (clearColorFilter) {
paint.setColorFilter(null);
}
}

// restore
paint.setAlpha(prevAlpha);
}
protected void onDraw(Shape shape, Canvas canvas, Paint paint) {
shape.draw(canvas, paint);
}


注意这段代码:

canvas.translate(r.left, r.top);
onDraw(state.mShape, canvas, paint);
canvas.restoreToCount(count);
在绘画前,先平移了一段距离,因为 Shape 默认是在 (0,0) 位置的。
@Override
protected void onResize(float width, float height) {
mRect.set(0, 0, width, height);
}


大小变化触发过程:

View 重画, view.drawBackground,setBackgoundBounds,shapeDrawable.onBoundsChange,updateShape,

shape.resize,onResize,shapeDrawable.draw,onDraw,shape.draw。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: