Path做为Android中一种相对复杂的绘图方式,官方文档中的有些解释并非很好理解,这里做一个相对全面一些的总结,供往后查看,也分享给你们,共同进步。java
dir
参数用来指定绘制时是顺时针仍是逆时针oval
做为椭圆的外切矩形区域addArc
方法类似,但也有区别,下文细述。二次贝塞尔曲线
,其中 (x1,y1)为控制点,(x2,y2)为终点三次贝塞尔曲线
,其中(x1,y1),(x2,y2)为控制点,(x3,y3)为终点上面的lineTo,MoveTo,QuadTo,CubicTo方法都有与之对应的rXXX
方法:算法
这些方法与之对应的原方法相比,唯一的区别在于:r方法是基于当前绘制开始点的offest,好比当前paint位于 (100,100)处,则使用rLineTo(100,100)
方法绘制出来的直线是从(100,100)到(200,200)的一条直接,因而可知rXXX
方法方便用来基于以前的绘制做连续绘制。canvas
//原型
op(Path path, Path.Op op) //eg path1.op(path2,Path.Op.DIFFERENCE);
此方法用于对两个Path对象作相应的运算组合(combine),具体的说是根据不一样的op
参数及path2参数来影响path1对象,有点相似于数学上的集合运算。请看下面的例子:swift
Path path1 = new Path();
path1.addCircle(150, 150, 100, Path.Direction.CW); Path path2 = new Path(); path2.addCircle(200, 200, 100, Path.Direction.CW); path1.op(path2, Path.Op.DIFFERENCE); canvas.drawPath(path1, paint1);
效果以下:数据结构
经过不断修改path1.op的第二个参数依次能够获得以下效果:ide
Path.Op.INTERSECT
效果:动画
Path.Op.UNION
效果:ui
Path.Op.REVERSE_DIFFERENCE
效果:spa
Path.Op.XOR
效果:rest
设置path的填充模式.网上关于path的FillType的介绍不多,实际上在官方ApiDemos
里就有个很好的例子:
/**
* Created by ghui on 10/25/15.
*/
public class PathFillTypeView extends View { private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Path mPath; public PathFillTypeView(Context context) { super(context); setFocusable(true); setFocusableInTouchMode(true); mPath = new Path(); mPath.addCircle(40, 40, 45, Path.Direction.CCW); mPath.addCircle(80, 80, 45, Path.Direction.CCW); mPath.addCircle(120, 120, 45, Path.Direction.CCW); } private void showPath(Canvas canvas, int x, int y, Path.FillType ft, Paint paint) { canvas.save(); canvas.translate(x, y); canvas.clipRect(0, 0, 160, 160); canvas.drawColor(Color.WHITE); mPath.setFillType(ft); canvas.drawPath(mPath, paint); canvas.restore(); } @Override protected void onDraw(Canvas canvas) { Paint paint = mPaint; paint.setColor(Color.RED); canvas.drawColor(0xFFCCCCCC); canvas.translate(20, 20); paint.setAntiAlias(true); showPath(canvas, 0, 0, Path.FillType.WINDING, paint); showPath(canvas, 160 * 2, 0, Path.FillType.EVEN_ODD, paint); showPath(canvas, 0, 160 * 2, Path.FillType.INVERSE_WINDING, paint); showPath(canvas, 160 * 2, 160 * 2, Path.FillType.INVERSE_EVEN_ODD, paint); } }
效果以下:
(上面的例子在官方ApiDemo的基础上作了适当的修改)
所谓填充指的就是填充内部,setFillType
就是用来界定哪里算内部的算法。在计算机图形学中界定一个点是否是在多边形内部有两种算法:
关于这两种算法这里不做详细介绍。
前者指定在某处画一条弧线,仅此而已,不会受当前paint的位置所影响。而arcTo方法有两种形式:
addArc
方法没有区别。//代码1
Path path = new Path(); path.moveTo(100, 100); path.addArc(200, 200, 400, 400, 0, 150); canvas.drawPath(path, paint);
代码1效果以下图:
//代码2
Path path = new Path(); path.moveTo(100, 100); path.arcTo(200, 200, 400, 400, 0, 150, false); canvas.drawPath(path,paint);
代码2效果以下图:
若将代码2中的arcTo方法的参数修改成true则绘制的效果与代码1相同。
reset
清除path上的内容,重置path到 path = new Path()的初始状态。rewind
清除path上的内容,但会保留path上相关的数据结构,以高效的复用。
其它方法
fill-type
设置