HTML5 Canvas 禁用完美绘制提示

在某些情况下,在画布上绘制的结果可能会出乎意料。
例如,让我们绘制一个带填充、描边和不透明度的形状。
由于描边是在填充上绘制的,因此形状内部有一条半宽度的描边线,这条线看起来更暗
因为它是填充和描边的交集。

这可能不是你所期望的结果。因此,Konva 使用缓冲画布修复了这种行为。

在这种情况下,Konva 是这样做的:

  1. 在缓冲画布上绘制形状
  2. 无视不透明度进行填充和描边
  3. 在层的画布上应用不透明度
  4. 然后将来自缓冲的结果绘制到层的画布上

但使用缓冲画布可能会降低性能。因此,您可以禁用这种修复:

shape.perfectDrawEnabled(false);

在这里查看差异:

Konva 禁用完美绘制演示view raw
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/konva@9.3.18/konva.min.js"></script>
<meta charset="utf-8" />
<title>Konva Disable Perfect Drawing 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();
stage.add(layer);

var group1 = new Konva.Group({
x: 50,
y: 50,
});
layer.add(group1);
var lebel1 = new Konva.Text({
text: 'Shape with default drawing behaviour',
});
group1.add(lebel1);
var rect = new Konva.Rect({
y: 20,
width: 100,
height: 50,
fill: 'green',
stroke: 'black',
strokeWidth: 10,
opacity: 0.5,
});
group1.add(rect);

var group1 = new Konva.Group({
x: 200,
y: 100,
});
layer.add(group1);
var lebel1 = new Konva.Text({
text: 'Shape with perfectDrawEnabled = false',
});
group1.add(lebel1);
var rect = new Konva.Rect({
y: 20,
width: 100,
height: 50,
fill: 'green',
stroke: 'black',
strokeWidth: 10,
opacity: 0.5,
perfectDrawEnabled: false,
});
group1.add(rect);
</script>
</body>
</html>