跳到主要内容

Wedge 扇形

扇形是从圆心张开的一块,饼图就是由一组扇形拼成的。

用法​

要使用Konva创建一个扇形, 我们可以实例化一个Konva.Wedge()对象.

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

<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/konva@10/konva.min.js"></script>
<meta charset="utf-8">
<title>Konva Wedge 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 wedge = new Konva.Wedge({
x: stage.getWidth() / 2,
y: stage.getHeight() / 2,
radius: 70,
angle: 60,
fill: 'red',
stroke: 'black',
strokeWidth: 4,
rotation: -120
});

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

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

</body>
</html>

常见问题​

angle 填的是角度还是弧度?​

默认是角度(0–360)。这由全局开关 Konva.angleDeg 控制,它默认为 true。

如果项目里有人把 Konva.angleDeg 设成了 false,全站所有图形的角度属性 (包括 rotation)都会改按弧度解释。这是个全局开关,改动它会影响每一处, 排查「角度突然全错了」时值得先确认这个值。

扇形从哪个方向开始张开?​

默认从 3 点钟方向(正右)开始,顺时针张开 angle 度。用 rotation 调整起始方向—— 画饼图时通常希望从 12 点开始,设 rotation: -90 即可。

每一块的 rotation 等于它之前所有扇形角度之和(再加上起始偏移), 按顺序累加即可,不需要额外的三角计算。

饼图相邻两块之间为什么有一条细缝?​

这是抗锯齿造成的。两个扇形共享一条边时,各自的边缘像素都只被画了「一半的覆盖率」, 叠加后仍然不足以填满,于是露出底色形成细线。

让相邻扇形的角度略微重叠(例如每块多画 0.5 度)就能消除。另一种做法是给每块 加上与填充同色的 stroke,用描边把缝盖住。

性能提示​

单个扇形很便宜,但饼图往往由十几块组成,且多数时候是静态的。这种情况下把整张饼图 放进一个 Konva.Group 并对该组调用 cache(),一次渲染成位图,之后每帧只贴一张图, 比逐块重绘划算得多。

需要注意缓存会固定当前外观,任何一块的颜色或角度变化后都要 clearCache() 再重新 cache()。所以带悬停高亮的饼图不适合整体缓存——那种场景下更好的做法是只给 不变的部分做缓存,把会变的那块单独留在外面。