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--; } } } }
其中传入的DisplayObject类必须继承后实现depth属性