Android 自定义View之Path

2021-03-28  本文已影响0人  一心729

Path用途:

按照路径的规则在路径上绘制自定义图形

在使用Path之前我们需要先了解Path的填充规则和绘制方向.

一. Path的填充规则:

  1. FillType.WINDING

默认的填充规则,螺旋/盘旋状,结合绘制方向共同决定.
相交点非0,在内部,填充,等于0,在外部,不填充(镂空).

  1. FillType.EVEN_ODD

奇数偶数填充规则,奇数为内部,则填充,偶数为外部,不填充(镂空),和绘制方向无关.

  1. FillType.INVERSE_WINDING

和FillType.WINDING填充规则相反

  1. FillType.INVERSE_EVEN_ODD

和FillType.EVEN_ODD填充规则相反

Path的绘制方向:

  1. Path.Direction.CW

CW: Clockwise, 顺时针方向

  1. Path.Direction.CCW

CCW: Counter-Clockwise, 逆时针方向

说明

填充规则和方向不适用于单图形的绘制,适用于多图形的绘制.

下面进行举例说明
在Path上绘制圆

//path的填充规则 
path.setFillType()
//direction 为方向
path.addCircle(centerX, centerY, radius, direction)

填充规则和绘制方向共同决定相交部分的填充方式,如下图:

适用的填充规则:
FillType.WINDINGFillType.INVERSE_WINDING

CCW_CW
从圆内任意位置为起点,发出一条射线,如果在方向左侧,则加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_ODDFillType.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)

参数说明:

  1. path:需要测量的Path
  2. forceClosed: Path是否自动闭合.

常用方法:

  1. 获取Path的总长度
pathMeasure.length
  1. 获取切角,返回的是正切值
pathMeasure.getPosTan(distance, pos, tan)

参数说明:

  1. distance:采样点的距离, 0 <= distance <= length
  2. pos: 采样点的位置x,y信息,如果不为空则赋值给实参
  3. tan:采样点切线的正切值x,y,如果不为空则赋值给实参

返回结果说明:
如果没有与此度量对象关联的路径,则返回false

由于个人能力有限,如有错误之处,还望指出,我会第一时间验证并修改
大家一起进步,加油!!!

上一篇下一篇

猜你喜欢

热点阅读