forceMoveTo使用小结

forceMoveTo使用小结

先说结论forceMoveTo为true时,则相当于抬起画笔,再接着画下一个路径;forceMoveTo为false时,则相当于画笔不抬起来,接着上一笔路径的结尾处开始画下一个路径。Path的AddXXX()方法都是forceMoveTo为true(除了AddPath()方法),AddXXX()方法添加的路径都是闭合的。xxxTo()方法默认是forceMoveTo为false的。

以下代码画笔的style都是Paint.Style.FILL,这样才能看出区别

  1. forceMoveTo为false时
@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPath.addArc(100, 100, 200, 200, 140, 220);
        mPath.arcTo(200, 100, 300, 200, 180, 220, false);
        canvas.drawPath(mPath, mPaint);
    }

效果图
forceMoveTo为false
长成这个样子是因为,首先Paint.Style.FILL是默认会闭合填充的,闭合规则是当前这一笔的结尾直接连线到这一笔的开头。mPath先调用了addArc()方法,即添加了左边那半圆并且是闭合的路径。又调用了arcTo()方法,由于forceMoveTo为false,表示这一笔是连续画的,不抬起画笔,相当于直接画了一个M路径,那么这一笔的开头就是左下角那点,结束就是右下角那点,闭合路径时从右下角那点直接连线到左下角那点,就形成了这个样子。

  1. forceMoveTo为true时
@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPath.addArc(100, 100, 200, 200, 140, 220);
        mPath.arcTo(200, 100, 300, 200, 180, 220, true);
        canvas.drawPath(mPath, mPaint);
    }

效果图
forceMoveTo为true
闭合规则上边说了。mPath先调用了addArc()方法,即添加了左边那半圆并且是闭合的路径。又调用了arcTo()方法,由于forceMoveTo为true,表示这一笔是不连续的,即先画了左边的半圆后,抬起了画笔,然后再画右边的圆弧路径。那么当闭合时开头就是右边圆弧的起点,结束就是右边圆弧的终点,所以直线连过来后就形成这个样子。

再来一个

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPath.addArc(100, 100, 200, 200, 140, 220);
        mPath.arcTo(200, 100, 300, 200, 180, 220, true);
        mPath.lineTo(200, 300);
        canvas.drawPath(mPath, mPaint);
    }

效果图
forceMoveTo为true
在上边代码基础上加了一行lineTo()方法。左边半圆跟上边一样,右边由于lineTo()方法forceMoveTo默认为true,所以相当于一笔画了一个半圆加直线,开始就是半圆的起点,结束就是直线的终点,然后一条直线连接开始和结束,就形成了这个样子。
PS: 如果这里arcTo的forceMoveTo为false的话,则是一个心形。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值