我从网上的示例中尝试了许多不同的方法,但似乎无法使它正常工作。我正在尝试制作一种在 Canvas 上的2个点之间绘制一条曲线的方法。该曲线应由半径参数定义。

下面是我当前的代码。

public OverlayBuilder drawCurvedArrow(int startX, int startY, int endX, int endY, int curveRadius, int padding, int color) {
    PointF mPoint1 = new PointF(startX, startY);
    PointF mPoint2 = new PointF(endX, endY);
    Paint paint  = new Paint();
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(12);
    paint.setColor(color);
    Path myPath = new Path();

    myPath.moveTo(startX, startY);
    myPath.quadTo(mPoint1.x, mPoint1.y, mPoint2.x, mPoint2.y);
    canvas.drawPath(myPath, paint);

    return this;
}

编辑

问题是我不知道如何弯曲在 Canvas 上绘制的线。

最佳答案

我自己找到了解决问题的办法。即使有一些很好的答案,也不能完全解决我的特定问题。

这是我所做的:

  • 找到2个给定点之间的点
  • 计算两点之间的90度角
  • 使用之前计算出的度数,计算出从中间点开始的点X像素。
  • 对这3个点使用“path.cubicTo”(同时使用负值和正值来确定直线弯曲的方式)。

  • 如果有人遇到同样的问题,这是我的代码:
    public OverlayBuilder drawCurvedArrow(int x1, int y1, int x2, int y2, int curveRadius, int color, int lineWidth) {
    
        Paint paint  = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(lineWidth);
        paint.setColor(ContextCompat.getColor(context, color));
    
        final Path path = new Path();
        int midX            = x1 + ((x2 - x1) / 2);
        int midY            = y1 + ((y2 - y1) / 2);
        float xDiff         = midX - x1;
        float yDiff         = midY - y1;
        double angle        = (Math.atan2(yDiff, xDiff) * (180 / Math.PI)) - 90;
        double angleRadians = Math.toRadians(angle);
        float pointX        = (float) (midX + curveRadius * Math.cos(angleRadians));
        float pointY        = (float) (midY + curveRadius * Math.sin(angleRadians));
    
        path.moveTo(x1, y1);
        path.cubicTo(x1,y1,pointX, pointY, x2, y2);
        canvas.drawPath(path, paint);
    
        return this;
    }
    

    这是实现示例的示例:

    android - 如何在 Canvas 上的两个点之间绘制一条曲线?-LMLPHP

    10-04 22:44