매우 복잡 할 수 있습니다. 통합 할 수있는 가장 간단한 방법은 요소를 g/group 요소 내부로 드래그하여 배치하는 것입니다. 그런 다음 해당 외부 g/group 요소에 드래그를 놓습니다.
내부 요소의 기존 변형을 그대로 유지하고 지저분하지 않습니다. 그래서 당신이 svg에 여분의 그룹 요소를 포함 할 수 있다면, 나는이 길로 갈 것입니다.
이유가 무엇이든간에 할 수 없다면. 나는 장기간 (특히 당신이 역동적 인 회전 등을 포함한 freetransform을 할 것이라면), 나는 당신이 훨씬 더 복잡하게 될 필요가 있다고 생각한다. 나는 아마도 내가 사용할 수있는 시작 경로를 포함하고 있는데, 이것은 또한 추가 된 복잡성을 가져 오기 때문에 스케일 된 뷰 박스/스크린에도 대응할 수있을 것이다.
그래서 아마도 새로운 방법 몇 가지를 소개 할 ...
getCursorPoint은 (요소와 반대) 화면에 어떤 변환를 차지, 마우스의 실제 지점을 가져옵니다. 아직 구체적인 예를 들어 보지 못했지만 나중에 종이를 확대하거나 축소하여이 문제에 부딪 힐 수 있습니다.
getTransformedDrag는 드래그 할 때의 화면 변형을 설명합니다.
Element.prototype.getCursorPoint = function(x, y) {
var pt = this.paper.node.createSVGPoint();
pt.x = x; pt.y = y;
return pt.matrixTransform(this.paper.node.getScreenCTM().inverse());
}
Element.prototype.getTransformedDrag = function(otx, oty, x, y) {
var xy = this.getCursorPoint(x, y);
var tdx = {};
var snapInvMatrix = this.data('origTransform').invert();
snapInvMatrix.e = snapInvMatrix.f = 0;
tdx.x = snapInvMatrix.x(xy.x - otx, xy.y - oty);
tdx.y = snapInvMatrix.y(xy.x - otx, xy.y - oty);
return tdx;
}
이제 우리는 길 밖으로 드래그 주위 배경 보풀의 비트를 가지고, 우리는 .... 드래그 몇 가지 요소에
스토어의 가능성이있는, 화면 전환, 커서 위치와를들을 연결할 수 있습니다 요소의 초기 행렬
var dragStart = function(x, y, ev) {
this.data('origTransform', this.transform().localMatrix)
var txy = this.getCursorPoint(x,y)
this.data('oxy', {x: txy.x, y: txy.y });
}
var dragMove = function(dx, dy, x, y, ev) {
var tdr = this.getTransformedDrag(this.data('oxy').x, this.data('oxy').y, x, y)
this.data('xy', {
x: tdr.x,
y: tdr.y
})
.updateTransform();
}
Element.prototype.updateTransform = function() {
var newTransform = 't' + (this.data('xy').x) + ',' + (this.data('xy').y);
//newTransform += 'r' + (this.data('r'))
//newTransform += 's' + (this.data('s'))
this.transform(this.data('origTransform').toTransformString() + newTransform)
return this;
}
언급 한 바와 같이
Example jsfiddle
이 지나치게 복잡한 보일지도 모르지만, 난 그냥 매우 복잡한 지역이다 당신이 나중에 유용하게 사용할 수있는 몇 가지 추가 코드를 포함하기 위해 노력하고있어. 따라서 필요할 때 참조로 사용하십시오.
예제를 jsfiddle에 넣고 설명하는 것이 유용 할 것입니다. 확실하지 않은 점은, 이미 2의 배율이 있고 freetransform이 2 배의 배율을 갖는다면 왜 배율을 4로 변경하지 않겠습니까? 종종 내가 뭘 할 것인가, this.transform (this.transform() + myNewTransform); 그래서 그것은 언제나 원래의 변환을 포함하고, myNewTransform은 제어 핸들로부터 생성됩니다. – Ian
감사합니다. 데모 https://jsfiddle.net/jbvc1rhe/1/가 있습니다. transform 속성이 "plus"가 아니라 overwrite 될 수 있기를 바랍니다. 데모에서 두 가지 방법 중 하나를 시도하고 다른 결과를 얻었습니다. – david0116