跳到主要内容

Arc 弧形

弧形是圆环的一段,由内外半径和张角定义,进度环、仪表盘都靠它实现。

用法​

要使用Konva添加弧形, 我们可以实例化一个Konva.Arc()对象.

有关属性和方法的完整列表,请参阅Konva.Arc文档

<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/konva@10/konva.min.js"></script>
<meta charset="utf-8">
<title>Konva Arc Demo</title>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden;
background-color: #F0F0F0;
}
</style>
</head>
<body>
<div id="container"></div>
<script>
var width = window.innerWidth;
var height = window.innerHeight;

var stage = new Konva.Stage({
container: 'container',
width: width,
height: height
});

var layer = new Konva.Layer();

var arc = new Konva.Arc({
x: stage.getWidth() / 2,
y: stage.getHeight() / 2,
innerRadius: 40,
outerRadius: 70,
angle: 60,
fill: 'yellow',
stroke: 'black',
strokeWidth: 4
});

// add the shape to the layer
layer.add(arc);

// add the layer to the stage
stage.add(layer);
</script>

</body>
</html>

常见问题​

Arc 和 Wedge 有什么区别?​

Arc 有 innerRadius,画出来是环的一段,中间是空的; Wedge 从圆心张开,画出来是实心的扇形,像一块披萨。

做进度环、仪表盘用 Arc;做饼图用 Wedge。把 Arc 的 innerRadius 设为 0 确实也能得到扇形,但语义上不如直接用 Wedge 清楚。

设置了 clockwise 之后起止位置全乱了?​

clockwise: true 会让弧从起始角度反向扫过 angle 度。也就是说, 同样的 rotation 与 angle,翻转 clockwise 后弧出现在圆的另一侧。

比较稳妥的做法是先只调 rotation 把起点摆对,再决定 clockwise, 而不是两个一起试。

进度为 0 时为什么还残留一个点?​

angle: 0 的弧虽然没有面积,但它仍然是一条有效路径。如果设了 stroke, 描边会在起点位置画出一个小点或短线。

正确做法是进度为 0 时整个隐藏该节点(visible(false)),而不是把角度设成 0。 这同时也省掉了一次无意义的绘制。

与其他方案的取舍​

完整圆环用 Ring,一段圆环用 Arc,实心扇形用 Wedge。这三个覆盖了绝大多数圆形相关的需求, 都不需要手写路径。

Konva.Path 的 A(椭圆弧)命令更灵活——它支持长短半径不同、可以任意旋转, 还能和其他路径命令拼接。代价是没有 innerRadius 这种现成语义, 画环的一段要自己算出内外两条弧并闭合。只在 Arc 表达不了时才值得这样做。