2013-12-16 81 views
2

我有一個SWF文件,其中包含兩個「已導出用於ActionScript」的符號。這些都是簡單的正方形,其填充大小相等,但其中一個具有邊界,另一個不具有邊界。同等縮放邊界和非邊界Flash圖形

我想在我的Flash應用程序中顯示這些圖形並排側,我想他們都被縮放(擴大)到相同的尺寸。我已經寫了一些相當簡單的代碼從SWF加載這些符號,並顯示它們(見下文),但由於預期接壤元素沒有大小:

邊框使通過超過邊界的尺寸減小圖形將其放大。


我用下面的代碼來執行上面的測試。

<?xml version='1.0'?> 
<s:Application 
    xmlns:fx='http://ns.adobe.com/mxml/2009' 
    xmlns:s='library://ns.adobe.com/flex/spark' 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    initialize='init(drawArea)' 
> 
<mx:UIComponent id='drawArea' left='0' top='0' width='250' height='250'></mx:UIComponent> 
<fx:Script><![CDATA[ 
import mx.controls.SWFLoader; 

static function init(drawArea:UIComponent):void { 
    var loader:SWFLoader = new SWFLoader(); 
    loader.addEventListener(Event.COMPLETE, onSwfLoaded); 
    loader.load('./borderings.swf'); 

    function onSwfLoaded(e:Event):void { 
     var getDefinition:Function = e.target.loaderContext.applicationDomain.getDefinition; 

     var Bordered:Class = getDefinition('bordered'); 
     var bordered:MovieClip = new Bordered; 

     bordered.x = 100; 
     bordered.y = 100; 
     bordered.width = 100; 
     bordered.height = 100; 

     var borderedContents:DisplayObject = bordered.getChildAt(0); 
     assert(bordered.numChildren === 1); 

     assert(borderedContents.x == 0); 
     assert(borderedContents.y == 0); 
     assert(borderedContents.width == 14.1); 
     assert(borderedContents.height == 14.1); 

     drawArea.addChild(bordered); 


     var Borderless:Class = getDefinition('borderless'); 
     var borderless:MovieClip = new Borderless; 

     borderless.x = 250; 
     borderless.y = 100; 
     borderless.width = 100; 
     borderless.height = 100; 

     var borderlessContents:DisplayObject = borderless.getChildAt(0); 
     assert(borderless.numChildren === 1); 

     assert(borderlessContents.x == 0); 
     assert(borderlessContents.y == 0); 
     assert(borderlessContents.width == 13.1); 
     assert(borderlessContents.height == 13.1); 

     drawArea.addChild(borderless); 

     drawArea.graphics.lineStyle(1.0, 0xFF0000, 1.0); 
     drawArea.graphics.moveTo(25, 50); 
     drawArea.graphics.lineTo(325, 50); 
     drawArea.graphics.moveTo(25, 150); 
     drawArea.graphics.lineTo(325, 150); 
    } 
} 

static function assert(pass:Boolean, msg:String=null):void { 
    if (!pass) throw new Error(msg || 'assertion failed'); 
} 
]]></fx:Script> 
</s:Application> 

可以找到完整的IntelliJ測試項目in this git repository on BitBucket


閃存編輯聲稱,符號都具有相同的尺寸:通過13.10px 13.10px,雖然在視覺上這似乎是不包括邊界的外半部:

但是,當我使用ActionScript檢查這些圖形的實例時,它會報告邊框圖形較大,爲14.10px,14.10px。


爲什麼用這種奇怪的方式調整這些圖形的邊界?我怎樣才能使這個圖形的邊框和無邊框版本縮放到相同的尺寸?

+2

是你確定兩個盒子的註冊點都在同一個地方?這可以解釋對齊錯誤。 – frankhermes

+0

@frankhermes這是有益的,謝謝。我通過複製邊框符號並刪除邊框來創建無邊界符號,因此註冊點被複制並且與兩個符號中的填充位置相同。但是,這一點在圖形本身的左上方,所以在兩種情況下,點與圖形之間的距離是不同的。 –

+0

我進去並重新創建了這些圖形,以便在中心使用一個註冊點,這種類型固定了它們的對齊方式,除了現在導致圖形出現略微不同的尺寸(我認爲這種情況之前並不存在),而不是略有不同的立場。我會更新這個問題。 –

回答

2

對於縮放問題,您可以查看方法DisplayObject

AS3 Reference for getRect()

返回定義顯示對象的基於由所述targetCoordinateSpace參數定義的座標系統中,不包括形狀上的任何筆觸的邊界矩形。 getRect()方法返回的值與getBounds()方法返回的值相同或更小。

對於上面的例子,這可以被用於直接找出而忽略了筆畫,而不是使用通過widthheight屬性設置刻度的元素設置爲特定的尺寸所要求的比例因子。像這樣的功能會工作:

static function setDimensionsExcludingStrokes(
    subject:DisplayObject, width:int=-1, height:int=-1 
):void { 
    var innerDimensions:Rectangle = subject.getRect(subject); 

    if (width >= 0) { 
     subject.scaleX = width/innerDimensions.width; 
    } 

    if (height >= 0) { 
     subject.scaleY = height/innerDimensions.height; 
    } 
} 

而不是設置bordered.width = 100bordered.height = 100的,我們稱之爲:

setDimensionsExcludingStrokes(bordered, 100, 100); 

這導致在廣場在同一個目標尺寸被很好地對齊:

+1

感謝您的幫助;這讓我解決了我的問題。我已經在回答中添加了一些代碼,以顯示如何將這些代碼應用於上述特定問題。 –