flash对象永远置顶的众多技巧@张志晨as3经验46
1、知识准备: 有人说,as3没有层深了,对象的层交由flash自己管理。经过一些研究,我有了新的认识。 1.有对象存在,就必然有层次存在。不能说as3没有层深了,与as2不同的是:as3的层是连续的,总是从最底层的0往上排列,不再象as2,你可以指定任意深度。 2. as3的层深是个连续的数组:对象. numChildren可以获得对象内部子对象的个数,这个数减去1就是最高层。父对象.getChildIndex(子对象),可以获得子对象的层深。 3.一个对象只能有一个层深。于是,我们可以通过遍历层深访问舞台上的每一个对象。这有用吗?试想,舞台上有成千上万个对象,又没有一一命名,也没有压入数组,你想控制它们,怎么办?有这样一个现实的例子,在我给一家公司做电子地图时,需要标注地名,一个字是一个静态文本,总标注了1985个字。大家知道,静态文本不支持命名,如果要取得这些文字的内容及在地图上的位置,你有办法用代码实现吗?我有,我办到了,用到就是遍历层深。从而找到每一个字。访问方法:父对象. getChildAt(index),index为层深变量,自定义。然后判断它是不是静态文本框,如果是,就获取我们需要的东西(text,x,y,rotation)。 4.后添加到舞台(显示对象列表)的,总是处于最高(并且决定Tab键的顺序)。
2、常用方法: 在动画中,我们常常需要动画的标题、logo图案永远置顶,这就是做层深管理。 常用的方法是: 1.如果没有动态添加的对象,就在设计时把它们做在最高的图层上。应该说,这个谁都会。 2.如果有动态添加的对象,但它不会遮盖到需要置顶的对象,仍然用上一个方法。 3.如果动态添加的对象,能够通过遮罩技术做处理的,仍然可用第一种方法。 否则:我只有改变层深了。常用方法如下: a.获取最高层,再设置层次。 var index:int=置顶的对象.parent. numChildren-1---获取最高层数 置顶的对象.parent. setChildIndex(置顶的对象,index)实用中的例子: 在拼图游戏中,我们拖动哪个图片,就把哪个图块“置顶”,放下后“沉底”。 “置顶”:e.target.fatherMc. setChildIndex(e.target, e.target.fatherMc. numChildren-1) “沉底”: e.target.fatherMc. setChildIndex(e.target, 0) b.如果你觉得上面的方法麻烦,就把你要置顶的对象再添加一遍: 置顶的对象.parent.addChild(置顶的对象)
3、我的方法: 而我用的方法,却是下面的:Stage.addChild(置顶的对象)这个方法,只需要如此设置一次,一劳永逸!这也是本教程的闪光点!!!原理:stage是flash的顶级容器,在一个文档被创建时,stage下就会自动创建一个对象——主时间线Root,测试:trace(stage);trace(root);trace(this);trace(this.parent );trace(stage.numChildren);trace(this.numChildren);(//trace(root.numChildren);会报错)我们得到返回值:[object Stage][object MainTimeline][object MainTimeline][object Stage]10 这就说明:stage是顶级对象,下面的一个对象是root,就是主时间线,this指向root;在空白文档中,stage不为空,root为空。一般来说,我们就是在root时间线上做动画。回到刚才的问题上来,那么我们在stage下添加的一个mc后,发生什么变化呢?对比测试:trace(root.parent );trace(stage.numChildren);trace(this.numChildren);stage.addChild(mc)//此处添加------trace(root.parent );trace(stage.numChildren);trace(this.numChildren);输出结果:[object Stage]11//此为mc[object Stage]2//来了个mc,它和root并驾齐驱了,并且因为是后添加的,层次为1,在root上层。0//被移走了这下我们明白了,root是随着文档的创建而诞生的,处于stage的0层,因此结论有二: 一是,之后我们无论在root主时间上怎样折腾,都不会改变root的层次,所以后添加的元件如果添加到root里,就永远处于stage的0层里。 二是,后添加的元件如果添加到stage里,层次就会高于root,因而是后来者居上!!!我们在mc里再测试: trace(this)//得到[object Timeline_1] 这也是一条时间线!
4、知识延伸: 那么我可不可以改变stage里对象的层次呢?可以! 这样测试: stage.setChildIndex(this,1) 结果会发现:root升级了,跑到1层上来了。刚才那个包含标题、图标的mc又被遮挡了。
5、最终结论: 如果一些对象的层次关系不想改变,就添加到stage下,并一次性调整好层次,便可置顶的永远置顶,沉底的永远沉底,一劳永逸!