如何按一定要求绘制这样的分段圆

How to draw segmented circle like this with certain requirements

我好像想不通。我正在尝试绘制一个分段的圆圈(看起来像圆圈内的圆圈)。但是我希望这些段具有特定的颜色并且在较小的圆圈内是透明的。最好,我想让分段线的颜色不同于圆

以下是我想到的解决方案:

1- 大圆用填充色画圆弧,小圆画圆。 2个问题。第一个是内圈区域不再透明,因为它采用了较大区域的颜色。第二个问题是外圈的分割线一直到中心(不仅到内圈周长)

2) 大外圈画弧,内圈画圆。将其设置为颜色填充但不显示笔划。然后在顶部绘制另一个没有填充的外圈,只是为了显示笔划。然后使用计算(角度和半径)在内外圆之间画线以确定线的位置......非常复杂的解决方案,必须有另一种方法。即使使用此解决方案,中心显示的颜色仍然存在问题,但使用渐变可能会有所帮助。

我读了很多关于 SO 的内容,但我想不出正确的答案,因为许多答案会取消对圆参数的控制

求救!!!

@Override
public void draw(Canvas canvas) {
    float size = Math.min(getWidth(),getHeight());
    paint.setStrokeWidth(size/4);
    paint.setStyle(Paint.Style.STROKE);
    final RectF oval = new RectF(0, 0, getWidth(), getHeight());
    oval.inset(size/8,size/8);

    paint.setColor(Color.RED);
    Path redPath = new Path();
    redPath.arcTo(oval, 0, 120, true);
    canvas.drawPath(redPath, paint);

    paint.setColor(Color.GREEN);
    Path greenPath = new Path();
    greenPath.arcTo(oval, 120, 120, true);
    canvas.drawPath(greenPath, paint);

    paint.setColor(Color.BLUE);
    Path bluePath = new Path();
    bluePath.arcTo(oval, 240, 120, true);
    canvas.drawPath(bluePath, paint);

    paint.setStrokeWidth(2);
    paint.setColor(0xff000000);
    canvas.save();
    for(int i=0;i<360;i+=40){
        canvas.rotate(40,size/2,size/2);
        canvas.drawLine(size*3/4,size/2,size,size/2,paint);
    }
    canvas.restore();

    final RectF ovalOuter = new RectF(0, 0, getWidth(), getHeight());
    ovalOuter.inset(1,1);
    canvas.drawOval(ovalOuter,paint);

    final RectF ovalInner = new RectF(size/4, size/4, size*3/4,size*3/4);
    canvas.drawOval(ovalInner,paint);
}

我正在使用路径 class 和笔划绘制圆弧。 Style.STROKE 给出没有填充的圆弧。描边宽度设置为 size/4,即视图的四分之一。笔划宽度的一半在外面,另一半在里面,像这样:

xxxxxxxx 宽度为 5 的圆弧的外边界

xxxxxxxx

------------行程

xxxxxxxx

xxxxxxxx 圆弧内边界

这就是我使用插图的原因 - 我需要稍微偏移笔划以使其适合视图。没有插图,弧线被视图的所有四个边切割。

为什么 canvas 旋转?因为用 built-in 方法旋转 canvas 比手动计算线更容易。旋转使用三角函数并很快变得非常复杂,难以阅读且容易出错。基本上我在旋转纸张并画直线。