Po wielu walczy i szuka i próbuje za pomocą końcówki dostarczone przez @Eric Rowell i kodu zamieszczonych w SO pytanie Zoom in on a point (using scale and translate) I wreszcie dostał powiększania i pomniejszania o stałym punkt pracy przy użyciu KineticJS.
Oto działa DEMO.
A oto kod:
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);
});
Dziękujemy! To działa. Przepraszam za późną odpowiedź. – Skarbo
Hej dziękuję, działa to dobrze, ale mam wiele warstw, więc nie mogę ustawić warstw jako "przeciągalne". dlatego ustawiam etap przeciągany. Kiedy przesuwam scenę jako przeciąganie, nie mogę przybliżyć do pożądanego punktu przybliżenia. Muszę ponownie przeliczyć cokolwiek jako etapy x i y, ale nie mogłem tego osiągnąć. Czy możesz mi pomóc? – magirtopcu
@ user1645941 Proszę, podziel się roboczym przykładem problemu, z którym masz do czynienia (może jako [skrzypce] (http://jsfiddle.net/)) i zrobię co w mojej mocy, aby pomóc. –