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);

}

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

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);

}

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

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);

}   

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

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);

}

效果图如下

INVERSE_WINDING.png

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

INVERSE_EVEN_ODD

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

INVERSE_EVEN_ODD.png

推荐阅读更多精彩内容

  • Android显示框架:自定义View实践之绘制篇 关于作者 郭孝星,程序员,吉他手,主要从事Android平台基...
    郭孝星阅读 6,547评论 2 31
  • 系列文章之 Android中自定义View(一)系列文章之 Android中自定义View(二)系列文章之 And...
    YoungerDev阅读 699评论 0 5
  • 最近项目中要实现加速球效果。是时候该学习一波了,好了废话不多说,记笔记,还是从自己发憷的自定义view开始。 先来...
    laifrog阅读 555评论 0 4
  • 上一篇内容自定义View(Path一)http://www.jianshu.com/p/7c1fde3e6c13 ...
    fcott阅读 114评论 1 1
  • 文:冬 有人说,从古至今,什么都会变,唯独爱一个人的感觉不会变!只要你还爱着,你就会变得敏感、多情!只要你...
    关于情感阅读 82评论 0 0