我有一个大的大型Sprite,当你旋转鼠标滚轮时,我想放大和缩小鼠标位置作为枢轴点,谷歌地图或photoshop缩放的工作原理。
在scaleX和scaleY属性之间实现缩放效果,但是固定点是(0,0),而我需要是鼠标位置(当然每次都会改变)。
我该如何更改?
感谢。
答案 0 :(得分: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);
任何未声明的内容都是“全球”
答案 1 :(得分: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 :(得分:-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;
}