as3学习第二课 显示对象和显示列表

关于显示对象

一、显示对象
   显示对象就是可以在舞台上显示的对象。包括直接看到的对象,如图形、文字、图片、视频、还有看不到但又真实存在的容器。
   所有的显示对象都继承于flash.dispaly包中的DisplayObject类。而DisplayObject类又继承自EventDispatcher类,这就意味着所有的显示对象都可以发送事件。
   根据显示对象能否接收互动事件(即:是否继承于interactiveObject类),我们把显示对象分为可互动和非互动显示对象。
   所谓接收互动事件,是指能够接收鼠标单击、键盘敲击等人机交互事件。按钮能够接收鼠标事件,所以按钮就归属于可互动显示对象。而位图不能调用鼠标事件,要想实现调用鼠标的功能,必须把位图放在一个容器里,所以位图就归属于非互动显示对象。
   能够容纳其它显示对象作为自己的子对象(即是否继承DisplayObjectContainer类),我们把显示对象分为显示对象容器和非容器显示对象。显示对象容器包括:Loader、Sprite、Stage和MovieClip,非容器显示对象包括位图、文本、图形、视频和按钮。把一个显示对象添加到一个容器中使用addChild方法。
   示例1:新建一个Flash文件,在舞台上画一个影片剪辑和按钮,分别取实例名为mc和btn,再新建一个小影片剪辑,实例名为mc0。
    第1帧代码:
mc.addChild(mc0);
mc0.x=mc0.y=0;
   测试影片,可以看到mc0被添加到了mc中。
    把代码改成:
btn.addChild(mc0);
mc0.x=mc0.y=0;
   测试影片,不但小影片没有添加到按钮中,反而抛出一个错误:1061: 调用可能未定义的方法 addChild (通过 static 类型flash.display:SimpleButton 引用)。
意思就是说,在定义单纯按钮这个类中并没有addChild这个方法。
   下面我们来认识几个对象(类):
Bitmap,位图对象。可以通过BitmapData对象来创建,也可以从外部载入。
Shape,形状对象。专门用来绘制矢量图形。
Video,视频对象。用来播放Flash视频,可以来自文件也可以来自网络流媒体。
SimpleButton,按钮类对象。在flash中创建按钮元件的ActionScript形式。
TextField,文本对象。用于文本显示和输入的显示对象。
Loader,加载对象。用来加载和显示外部的图片和swf文件。
Sprite,精灵对象。可以看成是没有时间轴的MovieClip。在AS3中,很多地方使用Sprite代替MovieClip,因为它是轻量级的容器。
MovieClip,影片剪辑对象。
Stage,舞台。所有的视觉元件都在它里面,是当之无愧的最终容器。
    二、显示列表
   在AS3中构建的每个交互应用程序都有一个由显示对象构成的层次结构,这个结构称为“显示列表”,是屏幕可见显示内容的层次结构。什么意思呢?就是父容器里面可以有子容器,子容器里面又可以有子容器,这样显示对象在其中就形成了层次结构。在脚本中创建的对象,如果不添加到这个层次中,就不会在舞台上显示。
   所以舞台是这个等级结构的最上层,舞台(Stage)是最根本的容器,包含着当前SWF所有的显示对象。舞台又是一个特殊的容器,每个应用程序只能有一个Stage对象,作为整个显示对象结构的根节点。
   舞台下面又是一个容器,被称为当前SWF主类的实例,也就是说,在AS3中,每个SWF文件都有一个关联的ActionScript类,该类称为“SWF文件的主类”。当这个swf文件设定了文档类,那么这个文档类就成了主类;如果是由FlashCS4自动生成而没有指定文档类,那么默认的MainTimeline类就是主类。当打开swf文件时,FlashPlayer将调用该类的构造函数,所创建的实例(始终是一种显示对象)将添加为Stage对象的子级。swf文件的主类始终扩展Sprite类。我们可以通过任何显示对象的stage属性来访问舞台。然后才是swf文件主类对象中创建的显示对象。
   每个容器和其子对象又可以连成一个局部树状图。也就是说每个容器拥有自己的列表,包含着自己的子对象和子容器。我们一般所讲的显示列表是指从根节点(Stage)开始的。
   我们来验证一下显示列表的树桩结构,通过上节课的示例1,自下而上,一层一层的寻找mc0上面的容器,在第一帧上写上:
mc.addChild(mc0);
mc0.x=0;
mc0.y=0;
trace("mc0的父容器是"+mc0.parent);
trace("mc0的爷爷容器是"+mc0.parent.parent);
trace("mc0的爷爷的父容器是"+mc0.parent.parent.parent);
//parent意思是父亲,在这里指父级容器。
//输出:
mc0的父容器是[object MovieClip]
mc0的爷爷容器是[object MainTimeline]
mc0的爷爷的父容器是[object Stage]
   是不是和列表中显示的等级结构一摸一样?
   最后再加上一句代码:
   trace("mc0的爷爷的爷爷容器是"+mc0.parent.parent.parent.parent);
//输出:mc0的爷爷的爷爷容器是null。
   说明Stage就是根节点,上面什么也没有。
   显示列表包含应用程序中的所有可视元素。
   一个程序中的显示对象分为在显示列表中和不在显示列表中。显示列表就是一张清单,只有清单上列出的内容才能在舞台上显示出来。换句话说,Flash只渲染显示列表中存在的内容。
   三、创建显示对象和渲染显示对象
   在AS3中,创建显示对象和渲染显示对象是两个独立的过程。创建显示对象可以用flashCS4创建,也可以用代码创建。用CS4工具创建对象就是直接在舞台上创建影片剪辑、按钮或元件。用代码创建对象的过程称为实例化对象,也就是创建特定类的实例。首先得声明一个变量,然而,声明变量仅仅是在计算机的内存中创建一个空位置,在尝试使用或操作变量之前,您必须为变量指定实际值(即创建一个对象并将之存储在变量中)。这时就需要使用new关键字加类构造函数。使用new运算符创建对象通常称为“调用类的构造函数”。构造函数是在创建类的实例的过程中调用的一种特殊方法。请注意,当以此方法创建实例时,请在类名后加上小括号,有时还可以指定参数值。
    示例2:
var circle:Sprite=new Sptiet();
circle.graphics.beginFill(0xffcc00);
circle.graphics.drawCircle(40,40,40);
trace(circle);
   测试影片,输出面板会输出[objectSprite],说明这个对象已经存在。new运算符还可用于创建库中定义、但没有放在舞台上的影片剪辑元件的实例。
    示例3:
   我们先在场景中画一个圆,转化为影片剪辑。再把舞台上的圆删除,现在库中已经有这么一个元件,只不过在new出这个对象之前我们要做一项工作:用鼠标右键单击库元件选择属性,选择为“ActionScript导出”选项打上勾,然后会发现CS4在“类”的输入栏中自动填入了元件名,我们把它改成Mc,点确定。这时会弹出一个类警告:无法在类路径中找打对此类的定义,因此将在导出时自动在swf中生成相应的定义。点确定。我们在第一帧上写代码:
var mc:Mc=new Mc();
   测试影片会发现,我们new出来的新对象circle和mc在舞台上并不可见。这是因为我们只创建了这两个对象但并没有渲染它们,也就是没有把它加入到显示列表。渲染显示对象,则必须把这个新建的显示对象添加到显示列表。Flash程序中所有的显示对象的添加流程如下:当一个Flash程序运行时,最先自动生成的是Stage容器对象,Stage容器对象是显示列表中的第一个显示对象容器。每个Flash程序只能有一个Stage。显示列表从Stage开始。其次,当第一个SWF文件被载入后,会自动生成Stage容器的一个子显示对象,也就是swf文件主类的实例。
   最后,才是swf文件主类对象中创建的显示对象,也就是我们用CS4工具创建或者是用代码创建的显示对象。FlashPlayer会按照它们加入显示列表的代码顺序逐一显示出来。而我们用代码创建的显示对象则需要我们用代码添加到显示列表中。加入到显示列表的方法有:
      addChild和addChildAt
   从显示列表中移除的方法有:
       removeChild和removeChildAt
   addChildAt和removeChildAt这一对方法因为涉及到显示对象深度的问题,所以先不讲。下面就来讲讲addChild和removeChild这两个方法。
   addChild方法将一个子显示对象添加到该显示对象容器中。子项将被添加到该容器实例中其它所有子项的前(上)面。
   removeChild从显示对象的子列表中删除指定的显示对象。
   addChild和removeChild方法的使用格式如下:
   容器对象.addChild(显示对象);
   容器对象.removeChild(显示对象);
   我们把示例3的代码改成:
var mc:Mc=new Mc();
addChild(mc);
   测试影片,舞台上出现用代码创建的新对象。如果我们要把显示对象从列表中移除,只需调用removeChild方法。
removeChild(mc);
   添加和删除显示对象应该注意以下几点:
   第一,addChild和removeChild方法只是显示对象容器的方法,是容器对子对象所执行的操作。当我们传入的参数不合理,比如我们要添加的对象就是容器本身或者是容器的父容器,或者要删除的子对象根本就不在显示列表中就会报错。
   第二,一个对象是否在显示列表中,不会影响显示对象自身的状态,比如:坐标、透明度、宽、高等属性。也就是说,即使我们把一个对象从显示列表中删除,这个对象依然存在,尽管我们看不到它。我们把示例3的代码改成:
var mc:Mc=new Mc();
trace(mc.width);
    输出:45
   测试影片时我们看不到影片剪辑,因为我们没有把它放到舞台上,也就是没有调用addChild方法。虽然mc0不在显示列表中,但我们还是能够获取它的宽。如果我们想彻底删除这个对象,就把这个对象设置为空(null)。
   第三,如果添加到显示列表显示对象的父容器不在显示列表中,那么这个显示对象不会被显示,同理,如果在显示列表中移除父容器,那么它的子对象也一起被移除。
   第四,显示对象的坐标属性值是相对于父容器的注册点的坐标,不是绝对坐标。父容器不同,则同样的子显示对象坐标值在屏幕上是位置也会不同。但我们看到在舞台上的位置却不一样。
   第五,在把显示对象添加到显示列表中时一定要注意一个问题:一个显示对象只能被添加一次,如果你在同一容器中再次添加它或者是把它添加到其它的容器中,那么先添加的那个会自动移除。只有最后加入的容器,才会拥有该显示对象。

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值