AS3容器:DisplayObjectContainer与Sprite、MovieClip

显示对象容器(DisplayObjectContainer)是显示对象的子类,可以在其内放置显示对象,当然也包括容器。

22.1 容器的概念和实现
容器有属于自己的子对象列表,既包括非容器显示对象也可以包括子容器对象。

在AS3中有6个重要的容器,包括DisplayObjectContainer的4个子类:Sprite、MovieClip、Loader和Stage
也包括Flex组件架构中的mx.core.UIComponent 、 mx.flash.UIMovie


22.1.1 DisplayObjectContainer类
与DisplayObject一样,不能实例化,也不能直接子类继承,它只作为一种数据类型,要使用,则要使用到它具体的容器子对象。
DisplayObjectContainer类具有4个属性和13个实例方法:
子显示对象数目属性: numberChildren:int

添加、删除子对象的方法: 添加: addChild方法、addChildAt方法 删除: removeChild方法、removeChildAt方法

访问子对象的方法: getChildAt 方法 、 getChildByName方法、getChildIndex方法、 getObjectsUnderPoint方法

检测子对象的方法: contains方法 、 areInaccessibleObjectsUnderPoint方法

设置叠放次序的方法: setChildIndex方法、 swapChildren方法、 swapChildrenAt方法

剩下三个属性: mouseChildren tabChildren textSnapshot

22.1.2 最轻量的容器:Sprite类

22.2 添加、删除视觉元件
在AS3中,创建对象和渲染对象是分开处理的,建立对象,一般只需要 new关键字加类构造函数即可。
渲染显示对象,则必须要将其加入到显示列表中,当加入的容器不在显示列表中的时候,加入的子对象也不显示。
添加、删除子对象的方法: 添加: addChild方法、addChildAt方法 删除: removeChild方法、removeChildAt方法


22.2.1 Flash程序中所有显示对象的添加流程
Flash运行过程
先创建一个Stage容器对象,当第一个SWF载入后,会自动成为Stage容器的一个子显示对象。


22.2.2 addChild方法、removeChild方法和contains方法
addChild方法:添加显示对象到列表
removeChild方法:移除显示对象
contains方法: 用于检测一个容器中是否包含指定显示对象

容器对象.addChild(显示对象);
容器对象.removeChild(显示对象);

addChild和removeChild都有返回值,返回作为目标参数的显示对象,当参数错误时,会抛出ArgumentError异常。

容器对象.contains(显示对象)
contains如果检测到传入的显示对象,则返回true,否则返回false,contains方法不仅检测当前容器所包含的子容器和子显示对象,
还检查子容器的子容器和显示对象。。。。一直到末端。最彻底的检测方法。

22.2.3 重要:添删显示对象的注意点
显示对象的状态独立于显示列表,即使从显示列表中删除显示对象,但显示对象的状态还是保持的。
显示对象的坐标座标属性相对于父容器注册点为准 。

同一个显示对象多次添加到不同容器时,只允许最后一个添加的容器拥有对象。
(同一个显示对象无论被代码加入显示列表多少次,在屏蔽上只会有一个显示对象.)


22.3 深度管理
深度由每个容器的子对象列表所管理。容器的numChildren属性显示该容器内所拥有的子显示对象数量。
子显示对象的深度同显示列表索引挂钩,从0到numChildren这个范围,连续无间断深度。
当更新显示对象深度时,子对象列表会自动更新该对象插入位后的索引。

22.3.1 深度的产生顺序和一个注重点
graphics对象不是Shape显示对象,也不在Sprite对象的子对象列表中,始终处于Sprite对象所有子对象的下面。

22.3.2 addChildAt和removeChildAt
指定添加显示对象的深度,可以用addChildAt,删除亦然。
容器对象.addChildAt(显示对象,深度);
容器对象.removeChildAt(深度);
两方法均返回显示添加和被删除的显示对象。
如果传入对象不合理,同样会触发ArgumentError异常对象。

22.3.3 交换不同深度的对象:swapChildren和swapChildrenAt
容器对象.swapChildren(显示对象A,显示对象B);
容器对象.swapChildrenAt(深度A,深度B);
两方法均不返回值。


22.3.4 重设列表中已有对象的深度:setChildIndex
容器对象.setChildIndex(显示对象,指定深度)
显示对象如果不在对象列表中,会抛出ArgumentError异常,如果指定深度超出合理范围,会抛出RangeError异常

常用方法:
置顶:
容器对象.setChildIndex(显示对象A,容器对象.numChildren-1)

置底:
容器对象.setChildIndex(显示对象A,0)

插入到显示对象B前:
容器对象.setChildIndex(显示对象A,容器对象.getChildIndex(显示对象B))

插入到显示对象B后:
容器对象.setChildIndex(显示对象A,容器对象.getChildIndex(显示对象B)-1)

使用setChildIndex后,显示对象列表会自动更新索引,不用我们操心。

22.4 访问和遍历容器子显示对象
在AS2.0中可以使用.点语法来访问对象,主要是因为MovieClip是动态类,可以动态添加子引用.
在AS3.0中, Sprite是最重要的容器,不是动态类,是密封类,因此不能使用点语法来访问。
Flash CS3创建环境下创建的MC可以用点语法访问,但在as中创建的MovieClip则不能使用点语法访问。
访问容器的子显示对象,有三种方法:通过深度访问、通过名字访问、通过全局座标访问。

22.4.2 通过深度访问子显示对象
容器对象.getChildAt(深度);
返回值为DisplayObject类型,使用DisplayObject前要对数据进行转换,getChildAt(深度) as 容器类型


22.4.3 遍历容器的子显示对象
使用递归,并判断返回的显示对象是否属于DisplayObjectContainer


22.4.4 通过name访问显示对象
容器对象.getChildByName("显示对象名字");

22.4.5 通过坐标访问显示对象
容器对象.getObjectsUnderPoint(点对象):Array

返回值是一个数组,其中包含该点下所有的显示对象~~~~~~~
如果检测到一个容器,则会继续检测其子对象。


22.5 MovieClip(影片剪辑)
AS3.0中,MovieClip的重要性被降低了,除了在创作时创建的MC具有时间轴外,用代码创建的不会拥有时间轴。
而一般用代码创建时,直接使用Sprite代替MovieClip。

22.5.1 MovieClip的播放
MovieClip在AS3中保留了AS2中所大部分属性和时间轴操作方法,基本没变。

22.5.2 为何在Flash创作工具中依然可以使用点号加影片实例名访问子影片
在AS2.0中直接使用点语法访问对象的方法在AS3.0中应当抛弃,而直接使用访问显示对象的三种标准方式来访问。

22.5.3 未公开的API:方便实用的 addFrameScript()
影片剪辑.addFrameScript(帧数1索引,函数1,帧数2索引,函数2,帧数n索引,函数n)
function 函数1():void{

{
function 函数2():void{

{

注意帧数索引是从0开始的。


22.6 加载外部图像、SWF文件
使用Loader类对象加载外部图像、SWF文件时,加载完成后将保存在Loader对象的content实例属性中。
Loader对象加载内容时,它的属性ContentLoaderInfo属性所持有的对象会发出加载进度事件。
监听加载进度发出的ProgressEvent.PROGRESS,该事件对象中含有bytesLoader(已加载)和bytesTotal(总字节)数据.

详细参看LoadBinary加载一章内容,雷同。

22.6.1 加载SWF文件示例
加载外部图像或SWF文件:使用Loader对象的load()方法

侦听加载完成事件:侦听contentLoaderInfo对象的Event.COMPLETE事件

访问加载对象及访问其听脚本或子显示对象:
加载成功后,加载的对象可以通过Loader对象的content属性访问到。或者,也可以直接访问contentLoaderInfo.content,
这两个对象均指向加载的对象,如果要访问被加载SWF文件中的脚本或显示对象,应先把这个content转型成被加载SWF文件的主类对象,再来访问它

使用contentLoaderInfo对象的applicationDomain属性获取外部SWF文件中的所有类信息。得到类定义后,创建新的实例。


22.6.4 访问被加载SWF文件的参数及访问网页传入的参数(flashvars)
AS3中所有传入参数,都放置在加载对象的loaderInfo属性中的parameter对象
加载对象.loaderInfo.pparameter.参数名
也可以用for in遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值