forceMoveTo使用小结
先说结论forceMoveTo为true时,则相当于抬起画笔,再接着画下一个路径;forceMoveTo为false时,则相当于画笔不抬起来,接着上一笔路径的结尾处开始画下一个路径。Path的AddXXX()方法都是forceMoveTo为true(除了AddPath()方法),AddXXX()方法添加的路径都是闭合的。xxxTo()方法默认是forceMoveTo为false的。
以下代码画笔的style都是Paint.Style.FILL,这样才能看出区别
- forceMoveTo为false时
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPath.addArc(100, 100, 200, 200, 140, 220);
mPath.arcTo(200, 100, 300, 200, 180, 220, false);
canvas.drawPath(mPath, mPaint);
}
效果图
长成这个样子是因为,首先Paint.Style.FILL是默认会闭合填充的,闭合规则是当前这一笔的结尾直接连线到这一笔的开头。mPath先调用了addArc()方法,即添加了左边那半圆并且是闭合的路径。又调用了arcTo()方法,由于forceMoveTo为false,表示这一笔是连续画的,不抬起画笔,相当于直接画了一个M路径,那么这一笔的开头就是左下角那点,结束就是右下角那点,闭合路径时从右下角那点直接连线到左下角那点,就形成了这个样子。
- forceMoveTo为true时
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPath.addArc(100, 100, 200, 200, 140, 220);
mPath.arcTo(200, 100, 300, 200, 180, 220, true);
canvas.drawPath(mPath, mPaint);
}
效果图
闭合规则上边说了。mPath先调用了addArc()方法,即添加了左边那半圆并且是闭合的路径。又调用了arcTo()方法,由于forceMoveTo为true,表示这一笔是不连续的,即先画了左边的半圆后,抬起了画笔,然后再画右边的圆弧路径。那么当闭合时开头就是右边圆弧的起点,结束就是右边圆弧的终点,所以直线连过来后就形成这个样子。
再来一个
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPath.addArc(100, 100, 200, 200, 140, 220);
mPath.arcTo(200, 100, 300, 200, 180, 220, true);
mPath.lineTo(200, 300);
canvas.drawPath(mPath, mPaint);
}
效果图
在上边代码基础上加了一行lineTo()方法。左边半圆跟上边一样,右边由于lineTo()方法forceMoveTo默认为true,所以相当于一笔画了一个半圆加直线,开始就是半圆的起点,结束就是直线的终点,然后一条直线连接开始和结束,就形成了这个样子。
PS: 如果这里arcTo的forceMoveTo为false的话,则是一个心形。