【发布时间】:2019-04-13 19:44:09
【问题描述】:
我的问题是如何制作一个用户界面,用户可以通过拖动在路径上的锚点来修改复杂的路径。注意on - 例如,example in the Konvajs documentation 中 Bezier 曲线的控制点不在路径本身,而我更喜欢锚点 on 复杂路径。
我将尝试修改在this question 中创建的曲线。
这是一个绘制示例路径的 sn-p。任何人都可以帮助我吗?稍微向下滚动 sn-p 窗口,然后单击矩形以查看路径动画。
var stage = new Konva.Stage({
container: 'container',
width: 500,
height: 500
});
var layer = new Konva.Layer();
var rect = new Konva.Rect({
x: stage.getWidth() / 2,
y: stage.getHeight() / 2,
stroke: '#555',
strokeWidth: 3,
fill: '#ddd',
width: 50,
height: 50,
shadowColor: 'black',
shadowBlur: 10,
shadowOffset: [10, 10],
shadowOpacity: 0.2,
cornerRadius: 10
});
var path = new Konva.Path({
x: stage.getWidth() / 2,
y: stage.getHeight() / 2,
data: 'M30 10 C-20 -50 -20 -70 50 -80 C150 -100 50 -150 -100 -80',
stroke: '#00D2FF',
strokeWidth: 5
});
var pathLen = path.getLength() + 10;
path.dashOffset(pathLen);
path.dash([pathLen]);
var anim = new Konva.Animation(function (frame) {
var dashLen = pathLen - frame.time / 5;
if (dashLen < 0) {
var tween = new Konva.Tween({
node: path,
duration: 1,
strokeWidth: 10,
easing: Konva.Easings.ElasticEaseOut
});
tween.play();
anim.stop();
} else {
path.dashOffset(dashLen);
}
}, layer);
rect.on('mousedown', function() {
anim.start();
})
layer.add(path);
layer.add(rect);
stage.add(layer);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/konva/2.5.1/konva.js"></script>
<div id='container' style="display: inline-block; width: 500px, height: 500px; background-color: silver; overflow: hidden; position: relative;"></div>
<div id='img'></div>
另外,谁能指出为什么在动画运行之前绘制了部分曲线?
【问题讨论】:
-
sn-p 做得很好。您看到的初始笔画将是您的数学错误 - 初始 dashOffset 不正确。关于控制点:对于贝塞尔曲线,控制点自然位于曲线之外。您可以通过将可拖动标签放在曲线上然后根据用户应用于标签的移动计算控制点的偏移量来尝试您需要的东西。我将首先解决如何在路径上适当位置放置标签的问题。
-
@Vanquiished Wombat,我稍微编辑了我的代码。现在没有动画之前的曲线部分,并且当您重复单击矩形时,曲线现在不会消失。
-
有一个非常相似的问题here,带有一个可以帮助您的工作示例的链接。
-
我不认为它与您如何定义路径有关-单个文本字符串 v 的多个绘图步骤,因为您可以使用其中任何一个绘制相同的路径-这是您如何操作感觉像问题的点对我来说。我无法“看到”的是如何在 UI 中定位复杂路径的控制点以便为用户提供有意义的图片,以及在拖动时如何操作路径。 second link 给出了一个很好的例子来拖动一条简单的曲线,但是如果路径中还有一条线段呢?
标签: javascript canvas konvajs