问问题
57952 次
5 回答
21
我设法让它工作。
在 jsFiddle 演示中,单击图像表示以单击点为中心的捏合手势。随后的点击以恒定的量增加比例因子。为了使它有用,您可能希望在转换事件上更频繁地进行缩放和转换计算(hammer.js 提供了一个)。
让它工作的关键是正确计算相对于图像的比例坐标点。我用来event.clientX/Y
获取屏幕坐标。以下行将屏幕坐标转换为图像坐标:
x -= offset.left + newX
y -= offset.top + newY
然后我们计算图像的新尺寸并找到要平移的距离。平移方程取自Stephen Woods 的演讲。
newWidth = image.width() * scale
newHeight = image.height() * scale
newX += -x * (newWidth - image.width) / newWidth
newY += -y * (newHeight - image.height) / newHeight
最后,我们缩放和翻译
image.css '-webkit-transform', "scale3d(#{scale}, #{scale}, 1)"
wrap.css '-webkit-transform', "translate3d(#{newX}px, #{newY}px, 0)"
我们在包装元素上进行所有翻译,以确保翻译原点位于图像的左上角。
于 2012-05-31T05:59:42.593 回答
7
我使用hammer和jquery成功地使用该片段来调整phonegap上的图像大小。
如果有人感兴趣,我将其翻译为 JS。
function attachPinch(wrapperID,imgID)
{
var image = $(imgID);
var wrap = $(wrapperID);
var width = image.width();
var height = image.height();
var newX = 0;
var newY = 0;
var offset = wrap.offset();
$(imgID).hammer().on("pinch", function(event) {
var photo = $(this);
newWidth = photo.width() * event.gesture.scale;
newHeight = photo.height() * event.gesture.scale;
// Convert from screen to image coordinates
var x;
var y;
x -= offset.left + newX;
y -= offset.top + newY;
newX += -x * (newWidth - width) / newWidth;
newY += -y * (newHeight - height) / newHeight;
photo.css('-webkit-transform', "scale3d("+event.gesture.scale+", "+event.gesture.scale+", 1)");
wrap.css('-webkit-transform', "translate3d("+newX+"px, "+newY+"px, 0)");
width = newWidth;
height = newHeight;
});
}
于 2013-05-10T22:00:21.963 回答
2
我查看了整个互联网和外部网络,直到我遇到唯一有效的插件/库 - http://cubiq.org/iscroll-4
var myScroll;
myScroll = new iScroll('wrapper');
其中 wrapper 是您的 id,如 id="wrapper"
<div id="wrapper">
<img src="smth.jpg" />
</div>
于 2013-07-02T15:03:44.543 回答
2
于 2014-09-01T13:34:12.603 回答
0
这是我几年前用 Java 写的,最近转换为 JavaScript
function View()
{
this.pos = {x:0,y:0};
this.Z = 0;
this.zoom = 1;
this.scale = 1.1;
this.Zoom = function(delta,x,y)
{
var X = x-this.pos.x;
var Y = y-this.pos.y;
var scale = this.scale;
if(delta>0) this.Z++;
else
{
this.Z--;
scale = 1/scale;
}
this.zoom = Math.pow(this.scale, this.Z);
this.pos.x+=X-scale*X;
this.pos.y+=Y-scale*Y;
}
}
this.Zoom = function(delta,x,y)
需要:
delta
= 放大或缩小x
= 缩放原点的 x 位置y
= 缩放原点的 y 位置
一个小例子:
<script>
var view = new View();
var DivStyle = {x:-123,y:-423,w:300,h:200};
function OnMouseWheel(event)
{
event.preventDefault();
view.Zoom(event.wheelDelta,event.clientX,event.clientY);
div.style.left = (DivStyle.x*view.zoom+view.pos.x)+"px";
div.style.top = (DivStyle.y*view.zoom+view.pos.y)+"px";
div.style.width = (DivStyle.w*view.zoom)+"px";
div.style.height = (DivStyle.h*view.zoom)+"px";
}
function OnMouseMove(event)
{
view.pos = {x:event.clientX,y:event.clientY};
div.style.left = (DivStyle.x*view.zoom+view.pos.x)+"px";
div.style.top = (DivStyle.y*view.zoom+view.pos.y)+"px";
div.style.width = (DivStyle.w*view.zoom)+"px";
div.style.height = (DivStyle.h*view.zoom)+"px";
}
</script>
<body onmousewheel="OnMouseWheel(event)" onmousemove="OnMouseMove(event)">
<div id="div" style="position:absolute;left:-123px;top:-423px;width:300px;height:200px;border:1px solid;"></div>
</body>
这是为了与画布和图形一起使用而制作的,但它应该适用于正常的 HTML 布局
于 2013-11-10T10:21:02.267 回答