Я ищу возможность временно отключить функции масштабирования, предоставляемые библиотекой d3. Я попытался сохранить пещеру текущие значения масштаба/трансляции, когда масштабирование отключено, и установите значения масштабирования/трансляции, когда масштабирование будет активным снова. К сожалению, это не сработает.Как временно отключить масштабирование в d3.js
Вот пример кода, я создал:
var savedTranslation = null;
var savedScale = null;
var body = d3.select("body");
var svg = body.append("svg");
var svgContainer = svg.append("svg:g");
var circle = svgContainer.append("svg:circle")
.attr('cx', 100)
.attr('cy', 100)
.attr('r',30)
.attr('fill', 'red');
circle.on('click', clickFn);
function clickFn(){
if (circle.attr('fill') === 'red'){
circle.attr('fill','blue')
}
else if (circle.attr('fill') === 'blue'){
circle.attr('fill','red')
}
};
svg.call(zoom = d3.behavior.zoom().on('zoom', redrawOnZoom)).on('dblclick.zoom', null);
function redrawOnZoom(){
if (circle.attr('fill') === 'red'){
if (savedScale !== null){
zoom.scale(savedScale)
savedScale = null
}
if (savedTranslation !== null){
zoom.translate(savedTranslation)
savedTranslation = null
}
// the actual "zooming"
svgContainer.attr('transform', 'translate(' + d3.event.translate + ')' + ' scale(' + d3.event.scale + ')');
}
else {
// save the current scales
savedScale = zoom.scale()
savedTranslation = zoom.translate()
}
};
EDIT:
Ложное поведение может быть воспроизведена с помощью следующих шагов:
- Click на круге цвет меняется на синий, масштабирование не работает
- Используйте колесико мыши в ОДНОМ НАПРАВЛЕНИИ несколько раз, как если бы вы увеличивали масштаб (например, увеличение)
- Нажмите снова на круге, цвет chnages красные, увеличение повторно включено
- Используйте колесо мыши, круг будет огромным/крошечным
Но как я должен выполнять, что функция «ничего не делает», но я могу снова включить масштабирование на какой-то момент, и это будет продолжаться с того момента, когда я отключить его? У меня были прыжки/движения в моей визуализации, потому что событие все еще реагирует на колесо мыши/указатель. – karlitos
Вы можете просто сохранить текущее состояние трансфокации/трансляции каждый раз, когда функция что-то делает, а затем возобновить ее с помощью переназначения при повторном подключении зума. –
Вот что я пытался достичь ... Не могли бы вы предоставить более подробную информацию о том, как достичь этого с помощью dr.js? – karlitos