Path使用
Path封装了由直线和曲线(二次,三次贝塞尔曲线)构成的几何路径。你能用Canvas中的drawPath来把这条路径画出来(同样支持Paint的不同绘制模式),也可以用于剪裁画布和根据路径绘制文字。我们有时会用Path来描述一个图像的轮廓,所以也会称为轮廓线(轮廓线仅是Path的一种使用方法,两者并不等价)。
canvas只能绘制出常见的形状,但是无法绘制出复杂的形状。
moveTo、 setLastPoint、 lineTo 和 close
moveTo:移动下一次操作的起点位置
setLastPoint:重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同
lineTo:添加上一个点到当前点之间的直线到Path
close:连接第一个点连接到最后一个点,形成一个闭合区域
Paint mPaint = new Paint(); // 创建画笔
mPaint.setColor(getResources().getColor(R.color.green));//设置画笔颜色
mPaint.setStyle(Paint.Style.STROKE);//设置画笔样式
mPaint.setStrokeWidth(10f); //设置画笔宽度为10pxPath path = new Path(); // 创建Path
path.lineTo(400, 400); // 添加(0,0)到(400,400)之间的直线
path.moveTo(400, 200); // 移动到(400,200)
path.lineTo(200, 0); // 添加(200,0)到(400,400)之间的直线
canvas.drawPath(path, mPaint); // 绘制Path

添加基本图形
Path提供了如下方法来添加基本图形
添加弧形
其他方法
isEmpty:判断path中是否包含内容
isRect:判断是否是矩形
set:将新的path赋值到现有path。
offset:将path平移一段
填充规则
我们要做一个同心圆,我们的代码如下:

但是得到的是一个实心圆。我们要给一个图形内部填充颜色,首先需要分清哪一部分是外部,哪一部分是内部,机器不像我们人那么聪明,机器是如何判断内外呢?
Path为我们提供setFillType方法来设置内外判定的规则
FillType是一个枚举类型,包括如下值
EVEN_ODD
INVERSE_EVEN_ODD
WINDING
INVERSE_WINDING
奇偶规则
EVEN_ODD遵从奇偶规则,即从任意位置p作一条射线, 若与该射线相交的图形边的数目为奇数,则p是图形内部点,否则是外部点。


INVERSE_EVEN_ODD遵从反奇偶规则。与奇偶规则相反。

非零环绕数规则
WINDING遵从非零环绕数规则,即首先使图形的边变为矢量(具有方向)。将环绕数初始化为零。再从任意位置p作一条射线。当从p点沿射线方向移动时,对在每个方向上穿过射线的边计数,每当图形的边从右到左穿过射线时,环绕数加1,从左到右时,环绕数减1。处理完图形的所有相关边之后,若环绕数为非零,则p为内部点,否则,p是外部点。

A点:首先,内圆从右向左穿过射线,环绕数加一(1);然后内圆从左到右穿过射线,环绕数减一(0);外圆从右向左穿过射线,环绕数加一(1)。由于该值不为零,所以属于内部。
B点:首先,内圆从左向右穿过射线,环绕数减一(-1);外圆从右向左穿过射线,环绕数加一(0)。由于该值为零,所以属于外部。

改变内圈的方向

A点:首先,内圆从左向右穿过射线,环绕数加一(-1);然后内圆从右到左穿过射线,环绕数加一(0);外圆从右向左穿过射线,环绕数加一(1)。由于该值不为零,所以属于内部。
B点:首先,内圆从右向左穿过射线,环绕数加1(1);外圆从右向左穿过射线,环绕数加一(2)。由于该值不为零,所以属于内部。

INVERSE_WINDING遵从反非零环绕数规则。与WINDING相反。


其他与填充模式相关的方法
除了上面提到的setFillType方法,Path还提供了下面3个与填充模式相关的方法:
布尔操作(API>19)
布尔操作是两个Path之间的运算,主要作用是用一些简单的图形通过一些规则合成一些相对比较复杂,或难以直接得到的图形。
在Path中的布尔运算有两个方法:
两个方法中的返回值用于判断布尔运算是否成功。Path.Op可选的值包括如下:
DIFFERENCE
差集
Path1中减去Path2后剩下的部分

REVERSE_DIFFERENCE
差集
Path2中减去Path1后剩下的部分

INTERSECT
交集
Path1与Path2相交的部分

UNION
并集
包含全部Path1和Path2

XOR
异或
包含Path1与Path2但不包括两者相交的部分


计算边界
这个方法主要作用是计算Path所占用的空间以及所在位置。
重置path
重置Path有两个方法,分别是reset和rewind,两者区别主要有以下两点:
reset
是
否
rewind
否
是
这个两个方法应该何时选择呢?
选择权重: FillType > 数据结构
因为“FillType”影响的是显示效果,而“数据结构”影响的是重建速度。
参考
最后更新于