私はこのようにします。レイヤー全体をズームしていますが、どの画像や形状でも機能します。setPositionにすべての作業を行わせ、新しい倍率に合わせて調整します。注1:キャンバスがページの上隅にない場合は、キャンバスの位置を取得して、pageX、Yの位置から削除する必要もあります。これは、関数getPos()が行うことです。私は別のstackoverflowトピックからまっすぐにそれを引き出しました。注2:zPポイントを使用して、ズームを実行する場所を制御します(つまり、マウスのクリック位置、またはズームよりも中央など)。
KineticJSパート...
layer.on("dblclick",function(ev){
var d=document.getElementById('photoCnvs');
var cnvsPos=getPos(d);
var R={ //(canvas space)
x: ev.pageX,
y: ev.pageY
};
var off0=this.getPosition();
var scl0=this.getScale().x;
var w=stageM.getWidth();
var h=stageM.getHeight();
//desired zoom point (e.g. mouse position, canvas center)
var zP={
//use these first two lines to center the image on the clicked point while zooming
//x: w/2,
//y: h/2
//use these next two lines to zoom the image around the clicked point
x: R.x-cnvsPos.x,
y: R.y-cnvsPos.y
}
//actual pixel value clicked (image space)
var xA={
x:(R.x-off0.x-cnvsPos.x)/scl0,
y:(R.y-off0.y-cnvsPos.y)/scl0
}
//rescale image
var sclf=scl0*1.10;
this.setScale(sclf);
//move clicked pixel to the desired zoom point
var newR={
x: zP.x-sclf*xA.x,
y: zP.y-sclf*xA.y
}
this.setPosition(newR.x, newR.y)
this.draw();
})
次に、キャンバス位置部分
function getPos(el) {
for (var lx=0, ly=0;
el != null;
lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent);
return {x: lx,y: ly};
}