基于鼠标位置缩放对象
问题描述:
我有一个大的大雪碧,我想放大和缩小鼠标的位置作为支点,确切地说google地图或photoshop缩放如何工作,当你旋转鼠标轮。基于鼠标位置缩放对象
为了展现scaleX和scaleY属性的缩放效果,但固定点是(0,0),而我需要是鼠标位置(当然每次都会改变)。
我该如何改变这种情况?
谢谢。
答
通过谷歌搜索正确的话找到了... 此链接说明了仿射变换http://gasi.ch/blog/zooming-in-flash-flex/ ,所以我可以补间的转换矩阵:
var affineTransform:Matrix = board.transform.matrix;
affineTransform.translate(-mouseX, -mouseY);
affineTransform.scale(0.8, 0.8);
affineTransform.translate(mouseX, mouseY);
var originalMatrix:Matrix = board.transform.matrix;
TweenLite.to(originalMatrix, 0.7, {a:affineTransform.a, b:affineTransform.b, c:affineTransform.c, d:affineTransform.d, tx:affineTransform.tx, ty:affineTransform.ty, onUpdate:applyMatrix, onUpdateParams:[originalMatrix]});
:-)
答
我刚刚做了一个Google search“关于任意点的缩放”(减去引号),第一个结果看起来很有希望。
您必须将原始偏移量从秤中取出,然后在新秤上重新应用它。我自己做了这件事,但是现在没有代码可以交给我,所以我会看看我是否可以将它挖出来并在以后发布。
这样做的伪代码是这样的(从内存中):未声明
float dir = UP ? 1 : -1;
float oldXscale = Xscale;
float oldYscale = Yscale;
Xscale += dir * increment;
Yscale += dir * increment;
newX = (oldX - Xoffset)/Xscale;
newY = (oldY - Yoffset)/Yscale;
Xoffset += (newX * oldXscale) - (newX * Xscale);
Yoffset += (newY * oldYscale) - (newY * Yscale);
什么是“全球性”
答
private static function onMouseWheel(event:MouseEvent):void {
var zoomAmount:Number = 0.03;
if (event.delta < 0)
zoomAmount *= -1;
var x:int = largeLargeSprite.mouseX;
var y:int = largeLargeSprite.mouseY;
largeLargeSprite.scaleX += zoomAmount;
largeLargeSprite.scaleY += zoomAmount;
largeLargeSprite.x -= x * zoomAmount;
largeLargeSprite.y -= y * zoomAmount;
}
啊,但是因为我补间,我不能只是“移动”精灵当补结束.. 我可以吐温x和y也,但是过渡4处房产一个复杂的对象开始在我看来太多(但也许我错了..我必须尝试) – Carlo 2009-05-31 17:02:45
那么这是你会做什么的基础,如果你手动补间,所以你可以设置结束从这个补间? – ChrisF 2009-05-31 17:08:53
通过手动补间手动输入框或事件回调本身。 val + =(cur - target)/ delta – FlavorScape 2013-11-07 00:40:49