android 画布中弧线之间的间距

odopli94  于 2022-12-21  发布在  Android
关注(0)|答案(4)|浏览(132)

我们的目标是画一个圆,圆上有代表时间片的弧线。

问题是每个弧之间都有一白色,我想删除它。而且,弧没有对齐。这是我的代码:

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);
    }
8ljdwjyq

8ljdwjyq1#

这可能只是处理弧段之间差距部分答案

下面是对javascript的一点小改动:http://jsfiddle.net/oakvLadb/
我只是随机生成了一些起始角和终止角。
重要的部分在于画圆弧:

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

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

其次是弧段拟合不良

当谈到线段似乎没有正确相交的事实时,我唯一能想到的是,你画的线段不是一个正圆,而是一个椭圆,这就是为什么它们没有正确相交的原因。如果你的rect2变量没有保存正方形的数据,你的线段就不会匹配。
看起来你确实有一个完美的正方形,所以它们应该对齐。在某个地方,有某种舍入误差...

9lowa7mx

9lowa7mx2#

您可以像图层绘制一样绘制更大的弧,而不是相邻绘制每个弧。
抱歉,我的英语。

zujrkrfu

zujrkrfu3#

我通过将图层类型设置为图层类型软件来解决这个问题。如下所示。setLayerType(View.LAYER_TYPE_SOFTWARE,null);

oyt4ldly

oyt4ldly4#

export const data = {
  labels: ['a', 'b', 'c', 'd'],
  datasets: [
    {
      label: 'Label',
      data: [1298, 1798, 2500, 2200],
      backgroundColor: [
        '#687EEB',
        '#FF4B5F',
        '#AA71F2',
        '#F29741',

      ],
      borderColor: [
        '#687EEB',
        '#FF4B5F',
        '#AA71F2',
        '#F29741',

      ],
      borderRadius: [
        10,
        10,
        10,
        10,

      ],
      spacing: 20, // i think, this is what you need
      borderWidth: 0,
      cutout: '80%',
      borderAlign: "inner"
    },
  ],
};

相关问题