首页 > Computer > as3中的深度管理的利于弊

as3中的深度管理的利于弊

as3相比于as1和as2,引入了新的深度管理方法。从而抛弃了as1,as2时期的swapdepth和getnexthigherdepth的深度管理方法。
代替他们的是addChildAt,addChild,removeChild,removeChildAt,swapChildAt等。
广大as3爱好者无不拍手称快。
新的深度管理的方式,将深度管理的工作交给flash自身进行,提供给用户的child索引实际上是连续的,避免的as1,2时期深度不连续的问题。同时深度管理也更加直观。

但是,从我而言,这种新式的深度管理同样也带来了弊端。

以上一篇博文中提到的多页连翻中的深度管理为例,我们可以发现,在多页连翻的过程中实际上是需要不停的去创建页面,并指定z序,同时还需要不停的交换不同页面的z序。这在as3时期的新的深度管理方法下面,简直是噩梦。
此时,你就不得不单独先一个类,去实现类似于as2时期的深度管理方案。这也就要求被管理的对象必须给其重新附加一个depth属性。
以下为depthmanager类源代码。

package org.kingse.CFlipPage.Utilities {
    import flash.display.*;
 
    public class DepthManger {
 
        public function DepthManger(){
            throw (new Error("静态类,不能实例化。", 9999));
        }
        public static function getNextHighestDepth(container:DisplayObjectContainer):Number{
            throw (new Error("未实现!"));
        }
        public static function remove(container:DisplayObjectContainer, displayobj:DisplayObject):void{
            container.removeChild(displayobj);
        }
        public static function addAt(container:DisplayObjectContainer, displayobj:DisplayObject, depth:int):void{
            var i:int;
            var childrencount:int = container.numChildren;
	        if (childrencount == 0){
                container.addChild(displayobj);
                displayobj["depth"] = depth;
                return;
            }
            if (container.getChildAt(childrencount-1)["depth"]<depth){
                container.addChildAt(displayobj,childrencount);
                displayobj["depth"]=depth;
                return;
            }
            i = childrencount-1;
            var depth1:int;
            var depth2:int;
            while (i >=0) {
                depth1=container.getChildAt(i)["depth"];
                if (i-1>=0){
                    depth2=container.getChildAt(i-1)["depth"];
                }else{
                    depth2=-1;
                }
                if (depth==depth1){
                    container.removeChildAt(i);
                    container.addChildAt(displayobj,i);
                    displayobj["depth"]=depth;
                    return;
                }
                if ((depth<depth1)&&(depth>depth2)){
                    container.addChildAt(displayobj,i);
                    displayobj["depth"]=depth;
                    return;
                }
                i--;
            }
        }
        public static function swapDepths(container:DisplayObjectContainer, displayobj:DisplayObject, depth:Number):void{
            var tempdepth:int;
	        if ((container == null) || (displayobj == null)){
                return;
            }
            var nowindex:int;
            var nowdepth:int;
            var aimdepth:int=int(depth);
            try{
                nowindex = container.getChildIndex(displayobj);
                nowdepth = displayobj["depth"];
                if (nowdepth == aimdepth){
                    return;
                }
            }catch(err:Error){
                return;
            }
            var childrencount:int = container.numChildren;
            var depth1:int;
            var depth2:int;
            var i:int=childrencount-1;
            if (container.getChildAt(i)["depth"] < aimdepth){
                container.removeChild(displayobj);
                container.addChild(displayobj);
                displayobj["depth"]=aimdepth;
            }
            while (i>=0){
                depth1=container.getChildAt(i)["depth"];
                if (i-1>=0){
                    depth2=container.getChildAt(i-1)["depth"];
                }else{
                    depth2=-1;
                }
                if (aimdepth==depth1){
                    container.swapChildrenAt(i,nowindex);
                    displayobj["depth"]=aimdepth;
                    container.getChildAt(nowindex)["depth"]=nowdepth;
                    return;
                }
                if ((aimdepth<depth1)&&(aimdepth>depth2)){
                    container.removeChild(displayobj);
                    if (nowindex>=i){
                        container.addChildAt(displayobj,i);
                    }else{
                        container.addChildAt(displayobj,((i-1<0) ? 0 : (i-1)));
                    }
                    displayobj["depth"]=aimdepth;
                    return;
                }
                i--;
            }
        }
    }
}
分类: Computer 标签: ,
  1. 2010年5月5日22:14 | #1

    其中传入的DisplayObject类必须继承后实现depth属性 :smile:

  1. 本文目前尚无任何 trackbacks 和 pingbacks.

:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: