Dopo un sacco di lottare e cercare e cercare, con la punta fornita dal @Eric Rowell e il codice pubblicato nel SO interrogare Zoom in on a point (using scale and translate) ho finalmente ottenuto lo zoom in e fuori di un determinato punto di lavoro utilizzando KineticJS.
Ecco una DEMO lavoro.
Ed ecco il codice:
var ui = {
stage: null,
scale: 1,
zoomFactor: 1.1,
origin: {
x: 0,
y: 0
},
zoom: function(event) {
event.preventDefault();
var evt = event.originalEvent,
mx = evt.clientX /* - canvas.offsetLeft */,
my = evt.clientY /* - canvas.offsetTop */,
wheel = evt.wheelDelta/120;
var zoom = (ui.zoomFactor - (evt.wheelDelta < 0 ? 0.2 : 0));
var newscale = ui.scale * zoom;
ui.origin.x = mx/ui.scale + ui.origin.x - mx/newscale;
ui.origin.y = my/ui.scale + ui.origin.y - my/newscale;
ui.stage.setOffset(ui.origin.x, ui.origin.y);
ui.stage.setScale(newscale);
ui.stage.draw();
ui.scale *= zoom;
}
};
$(function() {
var width = $(document).width() - 2,
height = $(document).height() - 5;
var stage = ui.stage = new Kinetic.Stage({
container: 'container',
width: width,
height: height
});
var layer = new Kinetic.Layer({
draggable: true
});
var rectX = stage.getWidth()/2 - 50;
var rectY = stage.getHeight()/2 - 25;
var box = new Kinetic.Circle({
x: 100,
y: 100,
radius: 50,
fill: '#00D200',
stroke: 'black',
strokeWidth: 2,
});
// add cursor styling
box.on('mouseover', function() {
document.body.style.cursor = 'pointer';
});
box.on('mouseout', function() {
document.body.style.cursor = 'default';
});
layer.add(box);
stage.add(layer);
$(stage.content).on('mousewheel', ui.zoom);
});
fonte
2012-12-01 19:59:24
Grazie! Questo funziona. Scusa per la risposta in ritardo. – Skarbo
Hey, grazie, funziona bene ma ho molti livelli, quindi non posso impostare i layer come "trascinabili". quindi ho impostato lo stage trascinabile. Quando sposto il tavolino come trascinamento, non riesco a zoomare sul punto di zoom desiderato. Devo ricalcolare qualcosa come il conteggio delle fasi x e y ma non riesco a raggiungerlo. Potresti aiutarmi? – magirtopcu
@ user1645941 Si prega di condividere alcuni esempi di lavoro del problema si sta trattando (forse come un [violino] (http://jsfiddle.net/)) e farò quello che posso per aiutare. –