HTML5中,如何从一个组中拖动对象并触发dragstart事件?

5

更新的工作范例

原始问题

我想知道为什么我在这个代码中无法从圆圈得到“dragstart”消息……

当拖动时,我无法获得“circle”消息。我尝试使用一些来自http://www.html5canvastutorials.com的可用代码。在这个代码中:http://www.html5canvastutorials.com/labs/html5-canvas-drag-and-drop-resize-and-invert-images/,它是有效的。

jsfiddle: http://jsfiddle.net/zoutepopcorn/YXJpH/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Untitled Document</title>

    <style>
          body {
            margin: 0px;
            padding: 0px;
          }
        </style>
    </head>

    <body>

    <div id="container"></div>
    <script src="http://www.html5canvastutorials.com/libraries/kinetic-v4.1.2.js"></script>
    <script src="setting.js"></script>
    <script src="imgStyle.js"></script>
    <script>
        var stage;
        var layer;
        setupStage();

        function setupStage() {
            stage = new Kinetic.Stage({
                  container: "container",
                  width: 800,
                  height: 800
                });
            layer = new Kinetic.Layer();
            messageLayer = new Kinetic.Layer();
            stage.add(messageLayer);
        }

    function writeMessage(messageLayer, message) {
            var context = messageLayer.getContext();
            messageLayer.clear();
            context.font = "18pt Calibri";
            context.fillStyle = "black";
            context.fillText(message, 10, 25);
    }

        function drawImage(imageObj) {
            var darthVaderImg = new Kinetic.Image({
              image: imageObj,
              x: 100,   
              y: 100,   
              width: 200,
              height: 137,
              draggable: true
            });
            var group = new Kinetic.Group({ draggable: true });
            group.add(darthVaderImg);

            var circle = new Kinetic.Circle({ x: 105, y: 105, radius: 10, fill: 'red', stroke: 'black', name: 'circle', strokeWidth: 4, draggable: true });

            group.add(circle)
            group.on("dragstart", function() { writeMessage(messageLayer, "group"); } );
            circle.on("dragstart", function() { writeMessage(messageLayer, "circle");  // <--- does not work in the GROUP!!! } );
            layer.add(group);
            stage.add(layer);
            stage.add(messageLayer);
            stage.draw();
        }

         var imageObj = new Image();
          imageObj.onload = function() {
            drawImage(imageObj);
          };
          imageObj.src = 'http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg'; 
    </script>
    </body>
    </html>
1个回答

2

您看不到来自圆形的消息,因为圆形是组的一部分,因此,在组或圆形上只能识别一个“dragstart”事件,当您尝试移动圆形时,该事件将被识别为组,因为圆形是组的一部分。您可以在与“dragstart”相关联的函数中添加一个检查,以检查选择的对象是否为“circle”,并显示您的消息。


1
circle.on("mousedown touchstart", function() { writeMessage(messageLayer, "圆形触摸"); group.on("dragmove", function() { writeMessage(messageLayer, "圆形移动"); }); }); darthVaderImg.on("mousedown touchstart", function() { writeMessage(messageLayer, "图像触摸"); group.on("dragmove", function() { writeMessage(messageLayer, "图像移动"); }); }); - Johan Hoeksma
如果您的问题已经解决,请考虑接受答案 :) 这将有助于其他人更容易地识别它。 - Ani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接