在as3中缩放对象

时间:2012-07-11 10:29:44

标签: actionscript-3 object scale

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

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是对象的当前比例。

那么如何将其缩放回原来的比例呢?感谢

2 个答案:

答案 0 :(得分:2)

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

唯一的问题是,这只适用于一个对象,因为在对此函数进行一次调用时将存储orig。

如果你想将这个函数用于任意数量的对象,那么它需要更多的思考,但它应该足以让你开始。

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);

答案 1 :(得分:0)

保存更改的比例。所以当你scaleAroundPoint(obj, p, 0.9)时,将0.9保存在某处。

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

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