自定义视图-圆角绘制由线条绘制的矩形角

时间:2019-05-22 17:47:36

标签: android android-view android-custom-view custom-view

我正在使用自定义视图,我想使用path.lineTo()path.arcTo()方法构建一个圆角矩形。
因此,我要获取的矩形:

enter image description here

通常我用以下代码块来绘制它:

    RectF backReftf = new RectF();
    Path path = new Path();
    int width = getWidth();
    int height = getHeight();
    float curve = (float) (0.1 *  height);
    RectF backReftf = new RectF();
    backReftf.left = 0;
    backReftf.top = 0;
    backReftf.right = width;
    backReftf.bottom = height;
    path.addRoundRect(backReftf, curve, curve, Path.Direction.CW);
    canvas.drawPath(path, paint);

但是我想用path.lineTo()path.arcTo()来绘制。

根据有关arcTo()的文档:

  

将指定的弧形作为新轮廓附加到路径上。如果路径的起点与路径的当前最后一个点不同,则将添加自动lineTo()以将当前轮廓连接到弧的起点。但是,如果路径为空,则使用圆弧的第一点调用moveTo()。

所以从理论上讲,我的弧线应该从此处开始,直线终止于此,因此,如果我绘制了一条直线(矩形的左侧):

    float curve = (float) (0.1 *  height);
    path.moveTo(0,0);
    path.lineTo(0, height - curve);

然后,我的弧应从该点(0,高度-曲线)开始,但是当arcTo()具有以下参数时,我应该在哪里传递这些参数:arcTo (float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo)

加上在这种情况下如何计算startAnglesweepAngle

谢谢!

1 个答案:

答案 0 :(得分:2)

绘制圆弧时,需要指定该圆弧的完整边界框以及起始角和后掠角。我尝试以视觉方式看到它们,就像这样:

arcTo angles

例如顺时针旋转时,起始角度与原点成180度。从startAngle开始,如果您顺时针旋转90度,您将最终到达所需的最终位置。

请注意此图形中原点,startAngle和sweepAngle的位置。 在Kotlin中,它可能看起来像这样:

// Given some radius, viewWidth and viewHeight
override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        path.apply {
            moveTo(radius, 0F)
            lineTo(viewWidth - radius, 0F)
            arcTo(viewWidth - 2 * radius, 0F, viewWidth, 2 * radius, -90F, 90F, false)
            lineTo(viewWidth, radius)
            arcTo(viewWidth - 2 * radius, viewHeight - 2 * radius, viewWidth, viewHeight, 0F, 90F, false)
            lineTo(radius, viewHeight)
            arcTo(0F, viewHeight - 2 * radius, 2 * radius, viewHeight, 90F, 90F, false)
            lineTo(0F, radius)
            arcTo(0F, 0F, 2 * radius, 2 * radius, 180F, 90F, false)
        }

        canvas?.drawPath(path, linePaint)
    }

结果将是这样的:

enter image description here