1

我在网上找到了这个功能,用于缩放对象并将它们保持在原始位置:

function scaleAroundPoint(target:DisplayObject, point:Point, scaleFactor:Number):void 
{ 
      var m:Matrix = target.transform.matrix; 
      m.translate( -point.x, -point.y ); 
      m.scale( scaleFactor, scaleFactor); 
      m.translate( point.x, point.y ); 
      target.transform.matrix = m; 

}

当我一开始这样称呼它时:

 scaleArountPoint(obj, p, 0.9);

该对象确实按比例缩小,但是,当我想将其恢复为原始大小时,显然这不起作用:

scaleArountPoint(obj, p, 1);

因为 1 是对象的当前缩放比例。

那么我如何将它缩小到原来的比例呢?谢谢

4

2 回答 2

2

您可以做到这一点的一种方法是存储目标的原始矩阵并始终将 scaleFactor 应用于此。

唯一的问题是这仅适用于一个对象,因为当对该函数进行一次调用时,将存储原点。

如果您想将此函数与任意数量的对象一起使用,则需要多考虑一下,但对于您开始使用它应该足够了。

import flash.display.Sprite;
import flash.geom.Point;
import flash.geom.Matrix;

var currentScaleFactor:int = 1;
var orig:Matrix;

function scaleAroundPoint(target:DisplayObject, point:Point, scaleFactor:Number):void 
{ 
  if(orig == null)
    orig = target.transform.matrix;

  var m:Matrix = orig.clone();
      m.translate( -point.x, -point.y ); 
      m.scale( scaleFactor, scaleFactor); 
      m.translate( point.x, point.y ); 
      target.transform.matrix = m; 
}

var spr:Sprite = new Sprite();
spr.graphics.beginFill(0x660000);
spr.graphics.drawCircle(100,100,100);
spr.graphics.endFill();

addChild(spr);

// set identity scale
scaleAroundPoint(spr, new Point(50,50), 1);

// try an arbitrary scale
scaleAroundPoint(spr, new Point(50,50), 0.2);

// revert to original scale
scaleAroundPoint(spr, new Point(50,50), 1);
于 2012-07-11T12:41:52.857 回答
0

保存更改的比例。因此,当您这样做时scaleAroundPoint(obj, p, 0.9),请将 0.9 保存在某处。

然后当你想缩放到原始尺寸时,缩放到1 / currentScale

请注意,当您多次调用 scaleAroundPoint(对于同一对象)时,您需要将新比例与当前比例相乘 ( currentScale *= scaleFactor),因此如果您按 50% 比例缩放两次,它将理解新比例为 25原始比例的 %。

于 2012-07-11T10:38:29.683 回答