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

これを行う 1 つの方法は、ターゲットの元の行列を保存し、常にこれに scaleFactor を適用することです。

唯一の問題は、この関数が 1 回呼び出されたときに orig が保存されるため、これが 1 つのオブジェクトに対してのみ機能することです。

この関数を任意の数のオブジェクトで使用する場合は、もう少し検討する必要がありますが、最初はこれで十分です。

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% で 2 回スケールすると、新しいスケールが 25 であることがわかります。元のスケールの %。

于 2012-07-11T10:38:29.683 に答える