如何根据某些要求绘制这样的分段圆

时间:2015-01-08 15:50:55

标签: android android-canvas

我似乎无法弄明白。我试图绘制一个分段的圆圈(看起来像圆圈内的圆圈)。但是我希望这些线段具有特定的颜色,并且在较小的圆圈内是透明的。优选地,我想使分割线的颜色不同于圆

enter image description here

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

1-绘制具有较大圆圈的填充颜色的圆弧,并为小圆圈绘制圆形。 2个问题。首先是内圈区域不再透明,因为它从较大的区域获取颜色。第二个问题是外圆的分割线一直到中心(不仅是内圆周边)

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

我在SO上阅读了很多,但我无法找到正确的答案,因为许多答案会删除对圆参数的控制

HEELP !!!

1 个答案:

答案 0 :(得分:3)

@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);
}

我使用Path类和笔画绘制弧。 Style.STROKE给出弧线而不填充。笔划宽度设置为大小/ 4,这是视图的四分之一。这个笔画宽度的一半在外面,后半部分在里面,如下:

xxxxxxxx宽度为5的弧的外边界

XXXXXXXX

------------中风

XXXXXXXX

弧的内边界xxxxxxxx

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

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

enter image description here