在从一个层次结构重新托管到另一个层次结构时,我有一个问题就是保持显示对象的相同转换。在下图中,您可以看到嵌套子“mc2”的影片剪辑“mc1”。 “mc2”有自己的孩子“mc3”等等。每个后代都以某种方式变换(旋转,缩放等)。我想从层次结构“mc1”中取“mc4”并将其放在层次结构“do1”的“do3”中(在每个级别中也有不同的转换)。
那么如何在不将其外观(位置除外)改为其他层次结构的情况下放置方形“mc4”? (想象一下拖放)。
我尝试使用Transform.concatenedMatrix属性,但我迷路了。
谢谢!
答案 0 :(得分: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 :(得分: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;
}