美文网首页
Android 自定义View之Path

Android 自定义View之Path

作者: 一心729 | 来源:发表于2021-03-28 17:19 被阅读0次

    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

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

    相关文章

      网友评论

          本文标题:Android 自定义View之Path

          本文链接:https://www.haomeiwen.com/subject/pijphltx.html