То, что я хочу достичь, - это возможность панорамирования всего изображения «SVG» во время операции перетаскивания.Панорама при перетаскивании в D3JS
Сейчас я играю в этом примере: https://bl.ocks.org/mbostock/6123708, поскольку я нашел его наиболее подходящим для меня (в основном потому, что он управляет перетаскиванием «правильно», большинство других примеров просто центрируют точку во время операции перетаскивания. Я буду перетаскивать более сложный объект, так что мне эта особенность я увеличиваю положение не изменится он больше подходит), но на самом деле не знаю, как я мог бы справиться с этой функцией панорамирования во время перетаскивания
- пользователь начнет тянуть круг USIN LeftMouseButton
- держит эту кнопку нажать RightMouseButton (затем начинается волшебство)
- весь SVG начинает перемещаться (панорамирование) и, таким образом, перетаскиваемый элемент (перетаскивание по-прежнему работает и обновляет положение, так что положение мыши над элементом перетаскивания не изменяется)
- пользователь освобождает RightMouseButton, SVG останавливает панорамирование и только сопротивление все еще работает
- релиз пользователя для LeftMouseButton и элементы сопротивления обновить его положение
Насколько я знаю, что я должен:
- обрабатывать сковороду только для RightMouseButton - решаемые
- обрабатывать Drag только для LeftMouseButton - в разработке :)
- позволяют Pan начать, когда я нахожусь в перетащить «режим» - это самый вопрос
- не позволяют вызвать контекстное меню, когда релиз RightMenuButton - решаемые
Извините за английские ошибки это не мой родные один, павшими свободно задавать любые вопросы, которые могли бы решить эту проблему :)
Update
На данный момент я заканчиваю с Souch код для перетаскивания:
var drag = d3.behavior.drag()
.on("dragstart", function() {
//d3.event.sourceEvent.stopPropagation();
d3.select(this).classed("dragging", true);
}).on("drag", function() {
var $this = d3.select(this);
var t = d3.transform($this.attr("transform"));
t.translate[0] += d3.event.dx;
t.translate[1] += d3.event.dy;
$this.attr("transform", "translate(" + t.translate + ")");
}).on("dragend", function() {
console.log("dragend");
d3.select(this).classed("dragging", false);
});
И Souch для увеличения:
var zoom = d3.behavior.zoom()
.scaleExtent([0.1, 2])
.on("zoomstart", function() {
if (d3.event.sourceEvent.buttons != 2) {
savedTranslation = zoom.translate();
} else {
savedTranslation = null;
}
}).on("zoom", function() {
var translate = d3.event.translate;
if (d3.event.sourceEvent.buttons != 2) {
zoom.translate(savedTranslation);
translate = savedTranslation;
}
svgContainer.attr("transform", "translate(" + translate + ")scale(" + d3.event.scale + ")");
}).on("zoomend", function() {
if (savedTranslation) {
zoom.translate(savedTranslation);
savedTranslation = null;
}
});
Использование зума + предотвратить контекстное меню (также блокировать двойной щелчок для увеличения масштаба, как это будет использовать для вызова редактировать всплывающие модальный)
var svg = d3.select("#svg-workspace")
.call(zoom)
.on("dblclick.zoom", null)
.on('contextmenu',function() {
d3.event.preventDefault();
return false;
});
И присоединять оды D3.JS
d3.select($foreignObject.get(0))
.call(drag);
в $ foreignObject является JQuery схватил объект
И зачёте проблема начать панорамирование при перемещении.