我想在KineticJS中创建一个复杂的形状。
我尝试了许多方式并进行了大量搜索,我得出的结论是,我应该创建一个包含内容的新Kinetic.Shape。但是当我这样做时,形状会被创建,但没有填充。
全是黑色。
这是我的代码:
var complexShape = new Kinetic.Shape({
drawFunc: function(){
<?php include_once "script/dude.js" ?>
}
});
//Add the shape to the layer
layer.add(complexShape);
“dude.js”的部分内容:(整件事约4000行)
var ctx = this.getContext();
// calque1/Groupe
ctx.save();
// calque1/Groupe/Groupe
ctx.save();
// calque1/Groupe/Groupe/Trac
ctx.save();
ctx.beginPath();
ctx.moveTo(325.6, 98.6);
ctx.bezierCurveTo(322.3, 86.4, 322.7, 73.7, 326.7, 60.6);
ctx.bezierCurveTo(317.3, 47.6, 309.7, 39.8, 303.7, 37.0);
ctx.bezierCurveTo(295.8, 42.3, 290.8, 61.0, 288.7, 93.1);
ctx.bezierCurveTo(283.5, 71.4, 282.5, 51.1, 285.7, 32.0);
ctx.bezierCurveTo(280.5, 22.3, 275.1, 14.8, 269.5, 9.5);
ctx.bezierCurveTo(265.6, 5.8, 261.7, 3.1, 257.6, 1.5);
ctx.bezierCurveTo(256.8, 4.1, 256.0, 6.8, 255.3, 9.5);
ctx.bezierCurveTo(249.2, 31.9, 247.5, 53.9, 250.1, 75.5);
ctx.lineWidth = 3.0;
ctx.strokeStyle = "rgb(75, 39, 111)";
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.stroke();
结果普通画布与KineticJS:
答案 0 :(得分:0)
Kinetic.Shape在画布上下文周围为您提供包装器,而不是实际的html画布上下文。
要执行描边/填充,请在drawFunc
这个神奇的方法然后在实际上下文中调用fill()和stroke()。
// both fill and stroke
context.fillStrokeShape(this);
但是你有另一个问题。
单个Kinetic.Shape只会在drawFunc中执行1次填充和描边。
因此,具有多个填充和描边的复杂形状将无效。
您至少有两种选择:
使用包含多个Kinetic.Shape对象的组。
通过获取实际画布上下文来“作弊”:var ctx=this.getContext()._context
答案 1 :(得分:0)
您没有正确使用Shape类。您需要访问传递到绘图函数中的Kinetic上下文对象。另外,正如Mark指出的那样,您需要使用Kinetic.Context方法来处理填充和描边。简写表示法是在绘图函数的末尾使用context.fillStrokeShape(this)。看一下本教程:
http://www.html5canvastutorials.com/kineticjs/html5-canvas-kineticjs-shape-tutorial/
或者,您也可以使用Path插件,它允许您使用SVG路径定义您的形状。这是一个关于它的教程:
http://www.html5canvastutorials.com/kineticjs/html5-canvas-kineticjs-path-tutorial/