canvas 中圆弧之间的间距

Spaces between arcs in canvas

目标是绘制一个圆弧,圆弧表示时间片。我这样做了:

问题是每个拱门之间有一个白色的space,我想把它去掉。此外,弧线未对齐。这是我的代码:

    int x = getWidth()/2;
    int y = getHeight()/2;
    int stroke = 20;
    int radiusExternal = 250;

    final RectF rect2 = new RectF();
    rect2.set(x - radiusExternal, y - radiusExternal, x + radiusExternal, y + radiusExternal);
    for (int i = 0; i < modProgram.getListEvents().size(); i++) {
        ModEvent event = modProgram.getListEvents().get(i);
        Paint paint2 = new Paint();

        paint2.setColor(getColorEvent(event));
        paint2.setStrokeWidth(stroke);
        paint2.setAntiAlias(true);
        paint2.setStrokeCap(Paint.Cap.BUTT);
        paint2.setStyle(Paint.Style.STROKE);
        int initialAngle = getInitialAngle(modProgram, event.getStartEvent());
        int sweepAngle = getSweepAngle(modProgram, event, initialAngle);
        canvas.drawArc(rect2, initialAngle, sweepAngle, false, paint2);
    }

您可以绘制更大的圆弧,而不是将每个圆弧彼此相邻绘制。

对不起我的英语。

这可能只是处理弧段之间间隙的部分答案

这是 fiddle 和 javascript:http://jsfiddle.net/oakvLadb/

我刚刚随机生成了一些起始角和终止角。

重点在于圆弧的绘制:

ctx.arc(c.width/2,c.height/2,radius,startAngle,stopAngle+anglePadding);

anglePadding 用于确保绘制一些额外的内容。当下一段开始从上一段的 stopAngle 开始绘制时,将有一个狭缝重叠,确保没有可见的间隙。

接下来是弧段拟合不好

当谈到线段似乎没有正确相遇的事实时,我唯一能想到的是你画的线段不是正圆而是椭圆形,这就是为什么他们没有正确见面的原因。如果您的 rect2 变量不包含完美正方形的数据,您的细分将不匹配。

看起来您确实有一个完美的正方形,因此它们应该对齐。某处存在某种舍入误差...

我通过将 LayerType 设置为 LAYER_TYPE_SOFTWARE 解决了这个问题。像下面。 setLayerType(View.LAYER_TYPE_SOFTWARE, null);