Android 自定义View之Path
Path用途:
按照路径的规则在路径上绘制自定义图形
在使用Path之前我们需要先了解Path的填充规则和绘制方向.
一. Path的填充规则:
FillType.WINDING
默认的填充规则,螺旋/盘旋状,结合绘制方向共同决定.
相交点非0,在内部,填充,等于0,在外部,不填充(镂空).
FillType.EVEN_ODD
奇数偶数填充规则,奇数为内部,则填充,偶数为外部,不填充(镂空),和绘制方向无关.
FillType.INVERSE_WINDING
和FillType.WINDING填充规则相反
FillType.INVERSE_EVEN_ODD
和FillType.EVEN_ODD填充规则相反
Path的绘制方向:
Path.Direction.CW
CW: Clockwise, 顺时针方向
Path.Direction.CCW
CCW: Counter-Clockwise, 逆时针方向
说明
填充规则和方向不适用于单图形的绘制,适用于多图形的绘制.
下面进行举例说明
在Path上绘制圆
//path的填充规则
path.setFillType()
//direction 为方向
path.addCircle(centerX, centerY, radius, direction)
填充规则和绘制方向共同决定相交部分的填充方式,如下图:
适用的填充规则:
FillType.WINDING
和 FillType.INVERSE_WINDING
从圆内任意位置为起点,发出一条射线,如果在方向左侧,则加1, 在方向右侧则减1,最终的值非0,在内部则填充, 等于0,在外部,则镂空,不填充.
分析:
射线1和圆1的相交点①在方向的左侧,则加1,结果为1,非0,所以在圆的内部,为填充模式;
射线2和圆2的相交点②在方向的右侧,则减1,结果为-1, 非0,所以在圆内部,为填充模式;
射线3和圆2的相交点③在圆2方向的右侧,则减1, 和圆1相交点④,在圆1绘制方向左侧,则加1, 最终的结果为0, 所以不在圆的内部,为非填充模式;
实际运行结果为:
image.png
适用填充规则:
FillType.EVEN_ODD
和 FillType.INVERSE_EVEN_ODD
从圆内任意位置为起点,发出一条射线,只要相交就加1,最终的结果,如果是奇数为内部,则填充,偶数为外部,不填充(镂空),和绘制方向无关.
image.png分析:
射线1和圆1的相交点①,则加1,结果为1,为奇数,所以在圆的内部,为填充模式;
射线2和圆2的相交点②,则加1,结果为1, 为奇数,所以在圆内部,为填充模式;
射线3和圆2的相交点③,则加1, 和圆1相交点④,则加1, 最终的结果为2,为偶数, 所以不在圆的内部,为非填充模式;
实际运行结果为:
image.png
所以一般做镂空处理通常使用FillType.EVEN_ODD
填充规则,不用计算绘制方向.
二. PathMeasure
对Path进行测量,测量Path的长度.
使用方式:
val pathMeasure = PathMeasure(path, forceClosed)
参数说明:
- path:需要测量的Path
- forceClosed: Path是否自动闭合.
常用方法:
- 获取Path的总长度
pathMeasure.length
- 获取切角,返回的是正切值
pathMeasure.getPosTan(distance, pos, tan)
参数说明:
- distance:采样点的距离, 0 <= distance <= length
- pos: 采样点的位置x,y信息,如果不为空则赋值给实参
- tan:采样点切线的正切值x,y,如果不为空则赋值给实参
返回结果说明:
如果没有与此度量对象关联的路径,则返回false
由于个人能力有限,如有错误之处,还望指出,我会第一时间验证并修改
大家一起进步,加油!!!