AS3 sprite 是不是容器? 怎么定义容器?

AS3 中容器怎么定义?
var _sprite:Spirte = new Sprite
_sprite 算不算是容器呢?
如果不是怎么定义容器呢?

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遍历
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-03
凡是继承DisplayObjectContainer类的子类 都是属于容器

简单的说 容器就是有子级列表的一个对象

Sprite 类是基本显示列表构造块:一个可显示图形并且也可包含子项的显示列表节点。
(所以Sprite类是一个容器)
请参考下面的官方文档 仔细看完就应该懂了
本回答被提问者采纳
第2个回答  2011-10-06

DisplayObjectContainer分支下的都为容器类 

 xiaoyu4922 帖的是我的笔记

第3个回答  2011-10-10
Sprite是容器,你可以这样定义,var _sprite:Spirte = new Spirte();

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网