2012-07-11 50 views
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是對象的當前比例。

那麼我如何將它縮放回原來的比例呢?謝謝

回答

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

Bellissimo Neil!我會修改它以支持多個對象,並在需要時將其發回。謝謝! – astralmaster 2012-07-11 12:56:11

+0

@astralmaster - 優秀,很高興它幫助 – Neil 2012-07-11 13:33:00

0

保存更改的比例。所以當你做scaleAroundPoint(obj, p, 0.9)時,將0.9保存在某個地方。

然後,當你想將規模擴大到原來的尺寸,規模1/currentScale

需要注意的是,當你調用scaleAroundPoint多次(相同的對象),您需要與當前比例乘以新的規模, (currentScale *= scaleFactor),所以如果按兩倍的比例縮放50%,就會明白新的比例是原始比例的25%。

+0

我這樣做了,每次放大多次後(縮略圖),原始比例都會稍微變化。我想這與截斷/舍入小數位有關。 – astralmaster 2012-07-11 12:10:24