2009-05-31 115 views
2

我有一个大的大雪碧,我想放大和缩小鼠标的位置作为支点,确切地说google地图或photoshop缩放如何工作,当你旋转鼠标轮。基于鼠标位置缩放对象

为了展现scaleX和scaleY属性的缩放效果,但固定点是(0,0),而我需要是鼠标位置(当然每次都会改变)。

我该如何改变这种情况?

谢谢。

回答

2

通过谷歌搜索正确的话找到了... 此链接说明了仿射变换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]}); 

:-)

2

我刚刚做了一个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); 

什么是“全球性”

+0

啊,但是因为我补间,我不能只是“移动”精灵当补结束.. 我可以吐温x和y也,但是过渡4处房产一个复杂的对象开始在我看来太多(但也许我错了..我必须尝试) – Carlo 2009-05-31 17:02:45

+0

那么这是你会做什么的基础,如果你手动补间,所以你可以设置结束从这个补间? – ChrisF 2009-05-31 17:08:53

+0

通过手动补间手动输入框或事件回调本身。 val + =(cur - target)/ delta – FlavorScape 2013-11-07 00:40:49

-1
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; 
}