【问题标题】:Transform (Move/Scale/Rotate) shapes with KineticJS使用 KineticJS 变换(移动/缩放/旋转)形状
【发布时间】:2012-08-31 19:37:48
【问题描述】:

我正在尝试为 KineticJS 构建一个转换管理器,该管理器将构建一个边界框并允许用户在其画布上缩放、移动和旋转图像。我被锚点的逻辑绊倒了。

http://jsfiddle.net/mharrisn/whK2M/

我只想让用户从任何角落按比例缩放他们的图像,并在按住拖动锚点时旋转。

谁能帮我指出正确的方向?

谢谢!

【问题讨论】:

  • 如果你需要教程请到这里:html5canvastutorials.com/kineticjs;当用户拖动锚点(我猜是每个角上的蓝色方块之一)时,您真的想旋转图像吗?看起来很混乱,也许你应该允许用户在变换/缩放/旋转上下文之间进行选择(你知道搅拌机吗?)
  • 看看这个小提琴,您可以使用第五个锚点来控制旋转,而其他四个锚点将控制缩放。
  • 使用 'dragstart' 和 'dragend' 和 'dragmove' 的旋转将通过获取鼠标位置的起点和终点/当前点来计算给定图像中心的角度。这类似于将您的图片放入 microsoft word 或 powerpoint 中。
  • 你更新了小提琴吗?

标签: javascript transform kineticjs


【解决方案1】:

这是我所做的旋转控制概念验证: http://codepen.io/ArtemGr/pen/ociAD

当控件被拖动时,dragBoundFunc 用于旋转它旁边的内容:

controlGroup.setDragBoundFunc (function (pos) {
  var groupPos = group.getPosition()
  var rotation = degrees (angle (groupPos.x, groupPos.y, pos.x, pos.y))
  status.setText ('x: ' + pos.x + '; y: ' + pos.y + '; rotation: ' + rotation); layer.draw()
  group.setRotationDeg (rotation); layer.draw()
  return pos
})

【讨论】:

    【解决方案2】:

    我也在做同样的事情,并且我发布了一个完全一样的问题,但我找到了一个链接,您可以在其中开发调整大小和移动工具。所以我也用过。但是它不包含旋转工具,但这对您来说也是一个好的开始,它非常简单且合乎逻辑。这是链接:http://www.html5canvastutorials.com/labs/html5-canvas-drag-and-drop-resize-and-invert-images/

    如果我设法让它完美地工作,我也会带着旋转工具回来。

    【讨论】:

      【解决方案3】:

      我希望我还没有迟到发布我制作的这段代码 sn-p。我和你们处理这类任务有同样的问题。自从我在处理图像和对象时尝试了这么多变通方法来模仿 fabricjs 框架的功能以来,已经过去了 3 天。我可以使用 Fabricjs,但似乎 Kineticjs 更快/更一致地处理 html5。

      幸运的是,我们已经有了现有的插件/工具,我们可以很容易地与 kineticjs 一起实现,这就是 jQuery Transform 工具。非常感谢本文的作者!只需在谷歌上搜索并下载它。

      我希望我创建的下面的代码可以帮助许多正在努力解决此类任务的开发人员。

      $(函数() {

          //Declare components STAGE, LAYER and TEXT
          var _stage = null;
          var _layer = null;
          var simpleText = null;
          _stage = new Kinetic.Stage({
              container: 'canvas',
              width: 640,
              height: 480
          });
          _layer = new Kinetic.Layer();
      
          simpleText = new Kinetic.Text({
                  x: 60,
                  y: 55,
                  text: 'Simple Text',
                  fontSize: 30,
                  fontFamily: 'Calbiri',
                  draggable: false,
                  name:'objectInCanvas',
                  id:'objectCanvas',
                  fill: 'green' 
                });
           //ADD LAYER AND TEXT ON STAGE     
          _layer.add(simpleText);
          _stage.add(_layer);
          _stage.draw();
      
          //Add onclick event listener to the Stage to remove and add transform tool to the object 
          _stage.on('click', function(evt) {
      
              //Remove all objects' transform tool inside the stage 
              removeTransformToolSelection(); 
      
              // get the shape that was clicked on
              ishape = evt.targetNode;
      
              //Add and show again the transform tool to the selected object and update the stage layer
              $(ishape).transformTool('show');
              ishape.getParent().moveToTop();
              _layer.draw();
      
          });
      
          function removeTransformToolSelection(){
              //Search all objects inside the stage or layer who has the name of "objectInCanvas" using jQuery iterator and hide the transform tool. 
              $.each(_stage.find('.objectInCanvas'), function( i, child ) {
                      $(child).transformTool('hide');
              });
          }
      
          //Event listener/Callback when selecting image using file upload element
          function handleFileSelect(evt) {
      
                 //Remove all objects' transform tool inside the stage 
                 removeTransformToolSelection(); 
      
                 //Create image object for selected file
                 var imageObj = new Image();
                 imageObj.onload = function() {
                          var myImage = new Kinetic.Image({
                          x: 0,
                          y: 0,
                          image: imageObj,
                          name:'objectInCanvas',
                          draggable:false,
                          id:'id_'
                   });
                   //Add to layer and add transform tool
                   _layer.add(myImage);
                   $(myImage).transformTool();
                   _layer.draw();
      
                  }  
      
                //Adding source to Image object.
                var f = document.getElementById('files').files[0];
                var name = f.name;
                var url = window.URL;
                var src = url.createObjectURL(f);
                imageObj.src = src;
          }
          //Attach event listener to FILE element
          document.getElementById('files').addEventListener('change', handleFileSelect, false);
      
      });
      

      【讨论】:

      • 哎呀,我忘记了 HTML 元素。
      • 现有的插件是什么?
      猜你喜欢
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      相关资源
      最近更新 更多