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);
目标是绘制一个圆弧,圆弧表示时间片。我这样做了:
问题是每个拱门之间有一个白色的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);