KineticJS - 在使用Group时在Shape覆盖上下文设置中使用drawFunc

chr*_*ard 1 shape html5-canvas kineticjs

我是使用HTML5 Canvas和KineticJS的新手,所以请原谅我,如果这是我的一个明显的错误.

我的问题是我正在使用由形状组成的组.形状使用drawFunc来完成绘制魔术.所有好东西.但是 - 我注意到我的Shape调用中的设置似乎覆盖了"全局"上下文设置.这是我创建的小提琴最好的显示,它为标准的"KineticJS拖放组" 演示添加了一些十字架(形状).

  // ----------------------------------------------------------[ my bit starts ]
        var tmp_x = i * 30 + 100
        var tmp_y = i * 30 + 40
        var shape = new Kinetic.Shape({

            drawFunc: function(context) {

                context.moveTo(tmp_x-10, tmp_y);
                context.lineTo(tmp_x + 10, tmp_y);
                context.moveTo(tmp_x, tmp_y - 10);
                context.lineTo(tmp_x, tmp_y + 10);

                this.fill(context);
                this.stroke(context);
            } ,
            fill: "#0FD2FF",
            stroke: "orange"
        });
        group.add(shape);
        // ----------------------------------------------------------[ my bit ends ]

        var box = new Kinetic.Rect({
            x: i * 30 + 210,
            y: i * 18 + 40,
            width: 100,
            height: 50,
            name: colors[i],
            fill: colors[i],
            stroke: 'black',
            strokeWidth: 4
        });

        group.add(box);
Run Code Online (Sandbox Code Playgroud)

您会注意到彩色框设置中的形状标记中的笔触和填充设置 - 除了在最后一个交叉(形状)之后创建的最后一个设置.

这感觉就像某种迟到的评价事情,因为事情只有在集团被渲染时才会完成.

有人能给我一个关于我做错了什么的线索吗?

mic*_*ard 6

上下文全局的,因此当您对其应用设置时,它们将持久保存用于使用上下文绘制的每个形状.

你需要调用context.beginPath()context.closePath()在你的drawFunc中,围绕你的其他调用context来表明这是一个与其他人不同的新形状.

那么现在,你的形状代码将是这样的:

var shape = new Kinetic.Shape({
    drawFunc: function(context) {
        context.beginPath();
        context.moveTo(tmp_x-10, tmp_y);
        context.lineTo(tmp_x + 10, tmp_y);
        context.moveTo(tmp_x, tmp_y - 10);
        context.lineTo(tmp_x, tmp_y + 10);
        context.closePath();

        this.fill(context);
        this.stroke(context);
    },
    fill: "#0FD2FF",
    stroke: "orange"
});
Run Code Online (Sandbox Code Playgroud)

这将防止您的上下文设置泄漏到其他形状.