【问题标题】:Draw overlapping areas on one path在一条路径上绘制重叠区域
【发布时间】:2014-12-20 19:01:44
【问题描述】:

我有一个跨越自身的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

单独的Paths 正确地将其共享区域变暗,但单个Path 不会。怎样才能达到与第一张图片类似的效果?

【问题讨论】:

    标签: android android-canvas porter-duff


    【解决方案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);
        }
    }
    

    【讨论】:

    • 我忘了提,如果您使用此方法将路径绘制到您管理的位图中,然后在您的View.onDraw() 期间将您的位图绘制到视图上,这也是一个非常好的主意。
    • 什么是 p2X , p2Y 这一切?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多