2012-06-28 17 views
2

從一個層次結構到另一個層次結構重新進行父級維護時,保持顯示對象的相同轉換時出現問題。在下面的圖片中,您可以看到嵌套子節點「mc2」的影片剪輯「mc1」。 「mc2」有自己的孩子「mc3」等。每個後代都以某種方式轉換(旋轉,縮放等)。我想從層次結構「mc1」中取出「mc4」,並放入層次結構爲「do1」的「do3」中(每層中也有不同的轉換)。在重新制作顯示對象時轉換矩陣操作

那麼我怎樣才能把方形「mc4」不改變它的外觀(除了位置)到其他層次? (想象一下拖放)。

我試着用Transform.concatenedMatrix屬性來做,但我迷路了。

謝謝!

nested movie clips

回答

3

幾個實驗後,我發現正確的回答自己:

import flash.display.DisplayObject; 
    import flash.display.DisplayObjectContainer; 
    import flash.geom.Matrix; 


function changeParent (displayObject : DisplayObject, newParent : DisplayObjectContainer, depth : int = -1) : void { 

    var concatenedChildMatrix  : Matrix = displayObject.transform.concatenatedMatrix; 

    var concatenedNewParentMatrix : Matrix = newParent.transform.concatenatedMatrix; 

    // invert matrix. It couses visual removal of transformations (movie clip looks like it wasn't transformed) 
    concatenedNewParentMatrix.invert(); 

    concatenedChildMatrix.concat(concatenedNewParentMatrix); 

    // if you want to add clip not on top level 
    if (depth >= 0) { 
     newParent.addChildAt(displayObject, depth); 
    } else { 
     newParent.addChild(displayObject); 
    } 

    // assign matrix back 
    displayObject.transform.matrix = concatenedChildMatrix; 

}  
1

你可以試試這個,它適合我的情況下(當所有你要做的就是修改秤/ X/Y /旋轉屬性),但使用變換矩陣時可能無法正常工作。

function changeParent(displayObj:DisplayObject, newParent:DisplayObjectContainer, depth:Number = -1, retainRelativeSize:Boolean = false):void { 
var tmpParent:DisplayObjectContainer = displayObj.parent; 

    while (tmpParent) { 
     displayObj.scaleX *= tmpParent.scaleX; 
     displayObj.scaleY *= tmpParent.scaleY; 
     displayObj.rotation += tmpParent.rotation; 
     tmpParent = tmpParent.parent; 
    } 

    tmpParent = newParent; 
    while(tmpParent){ 
     displayObj.scaleX = displayObj.scaleX/tmpParent.scaleX; 
     displayObj.scaleY = displayObj.scaleX/tmpParent.scaleY; 
     displayObj.rotation -= tmpParent.rotation; 
     tmpParent = tmpParent.parent; 
    } 

    var point1:Point= displayObj.localToGlobal(new Point()); 
    var point2:Point = newParent.globalToLocal(point1); 

    if (depth >= 0) { 
     newParent.addChildAt(displayObj, depth); 
    }else { 
     newParent.addChild(displayObj); 
    } 

    displayObj.x = point2.x; 
    displayObj.y = point2.y; 

} 
+0

謝謝!這對我有效,但這不是我想要得到的答案。 –

+0

再次感謝您的回答。我發佈了我自己的答案。也許它對你有用。 –