Android 关于Path的FillType

前言

在自定义View中我们接触过Path这个类,我们来说说关于Path的setFillType方法。
这个方法对应于枚举值FillType

public enum FillType {

    WINDING         (0),

    EVEN_ODD        (1),

    INVERSE_WINDING (2),

    INVERSE_EVEN_ODD(3);

}

默认值是WINDING。

WINDING

为了探究这几个值产生的效果,我甩手就是一段代码

protected void onDraw(Canvas canvas) {

    Path path = new Path();

    path.addCircle(200, 200, 100, Path.Direction.CW);
    path.addCircle(300, 200, 100, Path.Direction.CW);

    canvas.drawPath(path, paint);

}

这里按顺时针方向绘制了两个圆,效果图如下

Android 关于Path的FillType_第1张图片
WINDING.png

莫慌,容我反手再甩一段代码

protected void onDraw(Canvas canvas) {

    Path path = new Path();

    path.addCircle(200, 200, 100, Path.Direction.CW);
    path.addCircle(300, 200, 100, Path.Direction.CCW);

    canvas.drawPath(path, paint);

}

这里我修改了其中一个圆的绘制方向,效果图如下

Android 关于Path的FillType_第2张图片
WINDING.png

WINDING的原理

其实WINDING表示非零环绕原则从任意一点发射一条线,默认值是0,遇到顺时针交点则+1,遇到逆时针交点则-1,最终如果不等于0,则认为这个点是图形内部的点,则需要绘制颜色;反之,如果这个值是0,则认为这个点不在图形内部,则不需要绘制颜色。

EVEN_ODD

这个值和WINDING不同,WINDING要求每个图形都是有方向的。容我反手一段代码

protected void onDraw(Canvas canvas) {

    Path path = new Path();

    path.setFillType(Path.FillType.EVEN_ODD);

    path.addCircle(200, 200, 100, Path.Direction.CW);
    path.addCircle(300, 200, 100, Path.Direction.CW);

    canvas.drawPath(path, paint);

}   

效果图如下,咋一看好像和上面的一样

Android 关于Path的FillType_第3张图片
EVEN_ODD.png

EVEN_ODD原理

英文单词中EVEN是偶数,ODD是奇数的意思。这个原则也被称为奇偶原则从任意一点射出一条线,与图形的交线是奇数,则认为这个点在图形内部,需要绘制颜色;反之如果是偶数,则认为这个点在图形外部,不需要绘制颜色。

INVERSE_WINDING

inverse表示反转的意思,相同的一段代码,绘制出来的结果是相反的。反手一段代码

@Override
protected void onDraw(Canvas canvas) {

    Path path = new Path();

    path.setFillType(Path.FillType.INVERSE_WINDING);

    path.addCircle(200, 200, 100, Path.Direction.CW);
    path.addCircle(300, 200, 100, Path.Direction.CW);

    canvas.drawPath(path, paint);

}

效果图如下

Android 关于Path的FillType_第4张图片
INVERSE_WINDING.png

很明显和上面的WINDING效果相反

INVERSE_EVEN_ODD

我的手甩代码有点酸了,这里就不甩代码了。有了上面的经验,实际上就是EVEN_ODD的相反效果。效果图如下。

Android 关于Path的FillType_第5张图片
INVERSE_EVEN_ODD.png

你可能感兴趣的:(Android 关于Path的FillType)