ShapeDrawable
2016-04-01 13:45
267 查看
ShapeDrawable 用于绘制各种形状,使用 Shape 类来绘图。
Shape 类只负责 drawable 的形状和大小,颜色(材质 Shader) 以及 bounds 仍由 ShapeDrawable 本身管理。
shape.resize,onResize,shapeDrawable.draw,onDraw,shape.draw。
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。
相关文章推荐
- FFmpeg中的时间戳(DTS和PTS
- 史上最简单的时间管理方法,只需三招就够啦!
- Jsp页面中判断字符串是否包含另一个字符串的两种方法,js判断包含的indexOf()方法
- Intellij idea下spark开发HelloWorld
- 获取view所在的控制器
- ZooKeeper概述
- HDU 1285 确定比赛名次 【入门拓扑排序】
- 桌面有一个顽固文件删除不了
- ffmpeg解码流程
- update host
- CodeChef 2016年04月问题
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(4月1日)
- 【Java】推断文件的后缀名
- Ubuntu中Eclipse安装与配置
- css3动画
- 卸载 linux http
- Ext Js 4.x Tree从Json加载数据
- Windows Server 2008 搭建流媒体服务器
- Linux 2.6内核中新的锁机制RCU
- 图片提取小工具