7

我有一个Path越过自己的区域,我想更改不止一次越过的区域的颜色。如下所示:

期望的行为

所以我设置了我的油漆。

    highlighterPaint = new Paint();
    highlighterPaint.setAntiAlias(true);
    strokeWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20,
            displayMetrics);
    highlighterPaint.setStrokeWidth(strokeWidth);
    highlighterPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN));
    highlighterPaint.setAlpha(200);
    highlighterPaint.setStyle(Paint.Style.STROKE);
    highlighterPaint.setStrokeJoin(Paint.Join.ROUND);

但是当我打电话时canvas.drawPath(mPath1, highlighterPaint)canvas.drawPath(mPath2, highlighterPaint)我得到了下图。这张图片中有两条路径,它们的端点都被标记了。

实际行为

我正在将每条路径绘制到Canvas.

单独Path的 s 正确地使它们的共享区域变暗,但单个Path没有。我怎样才能达到类似于第一张图像的效果?

4

1 回答 1

1

Path根本无法做到这一点。不要害怕,有更好的方法!

诀窍是将路径分成许多较小的部分并分别绘制每个部分。

在我的例子中,我从一系列点(从触摸输入生成)创建了一条路径,并绘制了二次贝塞尔曲线来连接这些点。这是一个快速概述:

int numPoints = 0;
for (Point p : points) {
    p1X = p2X;
    p1Y = p2Y;
    p2X = p3X;
    p2Y = p3Y;
    p3X = p.x;
    p3Y = p.y;

    numPoints++;
    if (numPoints >= 3) {
        startX = (p1X + p2X) / 2.0f;
        startY = (p1Y + p2Y) / 2.0f;
        controlX = p2X;
        controlY = p2Y;
        endX = (p2X + p3X) / 2.0f;
        endY = (p2Y + p3Y) / 2.0f;
        path.rewind();
        path.moveTo(startX, startY);
        path.quadTo(controlX, controlY, endX, endY);
        canvas.drawPath(path, paint);
    }
}
于 2015-02-12T01:27:54.327 回答