【问题标题】:AngularJS - SVG drag a rotated ElementAngularJS - SVG 拖动一个旋转的元素
【发布时间】:2015-06-24 09:57:09
【问题描述】:

我在使用具有自己坐标空间的旋转 SVG 元素时遇到问题。正常的拖放不起作用。例如:元素向右移动而不是向上移动,向左移动而不是向下移动。我正在寻找一种简单的解决方案,对具有不同度数设置的 SVG 元素使用正常的拖放操作。

可以在这里看到一个演示http://jsfiddle.net/jmdajkkb/

HTML 视图:

<div ng-app>
    <div ng-controller="myController">
        <svg style="height: 612px; width: 612px;" ng-mouseup="mouseUp()" ng-mousemove="mouseMove($event)">
            <rect fill="orange" width="100" height="100" ng-mousedown="elementMouseDown($event)"  ng-attr-x="{{element.x}}" ng-attr-y="{{element.y}}" ng-attr-transform="rotate({{element.rotation.degree}}, {{element.rotation.x}}, {{element.rotation.y}})" />
        </svg>
    </div> 
</div>

JavaScript:

function myController($scope) {
    $scope.element = {
                "x": 350,
                "y": 50,
                "rotation": {
                    "degree": 60,
                    "x": 50,
                    "y": 50
                }
            };

    var isDragging = false, x, y;    

    $scope.elementMouseDown = function(eventArgs){
        isDragging = true;
        x = eventArgs.clientX;
        y = eventArgs.clientY;
    };

    $scope.mouseMove = function(eventArgs) {
        if(isDragging) {
            $scope.element.x += eventArgs.clientX - x;
            $scope.element.y += eventArgs.clientY - y;

            x = eventArgs.clientX;
            y = eventArgs.clientY;
        };
    };

    $scope.mouseUp = function() {
        isDragging = false;
    };
}

顺便问一下,“拖放”逻辑应该放在控制器还是指令中?

更新

是的,在转换中附加翻译它可以工作。但在我的项目中,我们有一个稍微复杂一点的场景。

用户可以在运行时插入更多元素(矩形)。他可以通过单击选择一个元素并使用拖放或旋转功能。选择元素在带有圆圈的单独组中可用。

这是获得更好视图的新代码:http://jsfiddle.net/kjaxdf8c/

【问题讨论】:

  • 将未旋转的&lt;g&gt; 元素作为&lt;rect&gt; 元素的容器并拖动它。
  • 我在一个矩形中有不同的子元素,在我的项目中固定 X 和 Y 位置。不幸的是,这种解决方法是不可能的。
  • 在 SVG 中 &lt;rect&gt; 元素不允许有孩子,所以我不明白你的评论。
  • 是的,没错。我有一个带有子元素的单独 .. 有固定位置.. 单独的 位于
  • 然后使用两个&lt;g&gt; 元素。祖父母可以保持固定,父母就是你拖动的东西。

标签: javascript angularjs html svg drag-and-drop


【解决方案1】:

我找到了解决方案。这是代码,它可以工作:

   app.directive('svgInternal', function () {
   var telo ='<g ng-mousedown="elementMouseDown($event)" ' +
   'ng-attr-transform=" translate({{element.x}},{{element.y}})'+
   'rotate({{element.rotation.degree}},'+
   '{{element.rotation.x}}, {{element.rotation.y}})">'+
   '<rect class="rect" fill="orange" width="100" height="100"'+
   ' '+
   '  />'+
   '<g class="rect" ng-show="isSelected" ng-attr-transform=" translate({{ 
   -element.x}},{{-element.y}})">'+ 

          '<circle fill="#3EA3DC" stroke-width="2" ng-attr-cx="
         {{elementSelections[0].x}}" ng-attr-cy="{{elementSelections[0].y}}" 
   r="8" />'+
            '<circle fill="#3EA3DC" stroke-width="2" ng-attr-cx="
   {{elementSelections[1].x}}" ng-attr-cy="{{elementSelections[1].y}}" r="8" 
   />'+
            '<circle fill="#3EA3DC" stroke-width="2" ng-attr-cx="
   {{elementSelections[2].x}}" ng-attr-cy="{{elementSelections[2].y}}" r="8"  
   />'+
            '<circle fill="#3EA3DC" stroke-width="2" ng-attr-cx="
   {{elementSelections[3].x}}" ng-attr-cy="{{elementSelections[3].y}}" r="8" 
  />'+

        '</g><text x="0" y="15" fill="red">{{element.x}}</text></g>';

return {
  templateNamespace: 'svg',
  template: telo,
  restrict: 'E',
  replace: true
};

});

来自 Goran 的问候

【讨论】:

  • 请解释为什么这段代码有效,以便其他人可以从你的答案中学习(这就是 stackoverflow 的用途)
猜你喜欢
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
相关资源
最近更新 更多