as3学习第二课 显示对象和显示列表
关于显示对象
原文地址: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)。 ???第三,如果添加到显示列表显示对象的父容器不在显示列表中,那么这个显示对象不会被显示,同理,如果在显示列表中移除父容器,那么它的子对象也一起被移除。 ???第四,显示对象的坐标属性值是相对于父容器的注册点的坐标,不是绝对坐标。父容器不同,则同样的子显示对象坐标值在屏幕上是位置也会不同。但我们看到在舞台上的位置却不一样。 ???第五,在把显示对象添加到显示列表中时一定要注意一个问题:一个显示对象只能被添加一次,如果你在同一容器中再次添加它或者是把它添加到其它的容器中,那么先添加的那个会自动移除。只有最后加入的容器,才会拥有该显示对象。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |