+ -
当前位置:首页 → 问答吧 → action script3.0可视化列表学习

action script3.0可视化列表学习

时间:2010-11-27

来源:互联网

我在学习as3可视化列表时遇到一个印象深刻的问题:可视化对象和可视化对象容器的区别。容器是能用来装东西的,而对象则不一定。例如,Movieclip可以是对象也可以是容器,但textfield等只能是对象。

       当对象被嵌套在多个容器中,要根据名称使用getChildByName()方法获取特定影片剪辑时,如果根据层级用点语法连写,则很容易出错。在应用方法的时候,要看清楚其返回类型。

比如:

var dd = aa. getChildByName(bbname).getChildByName(ccname);

则会报错.

因为getChildByName()方法返回的是“对象”而不是“容器”,为此,必须进行必要的转化,MovieClip是可以作为容器的。

Var tempMC:MovieClip = aa. getChildByName(bbname);//强制影片剪辑类型
var dd = tempMC. getChildByName(ccname);

 

下面我们来全面地认识一下as3.0的可视化列表原理和用法:

 

ActionScript 3.0 和Flash Player 9 的渲染模型已经和以前的版本有很大不同。以前MovieClip

是渲染的焦点。swf 电影的根节点就是MovieClip (现在用Stage). 根节点MovieClip 可以包含子

节点MovieClips, 子节点还可包含更多的子节点MovieClips。这样的层次结构用来控制

MovieClips 的绘制(深度越深表示显示在最顶层)。createEmptyMovieClip( ), attachMovie( ), 或

duplicateMovie- Clip( ) 用来创建MovieClips。一旦MovieClip 被创建,它就自动添加到这个可视

化层级列表中通过渲染器进行绘制。MovieClips 在层级列表中不能移动位置,非要这么做则只

有删除当前的,然后在指定位置创建。

新的渲染器仍基于层级结构,但是于之前相比是经过最优化处理,更简单和灵活。新的渲染模

型类都集中在flash.display 包中。这个包中包含所有在.swf 电影中用到的可视化类。其他不在

该包中的任何对象都不会被渲染器绘制。每个.swf 电影包含一个可视化对象列表,有下面三种

类型:

stage

stage 是可视化对象列表层级的根节点。每个电影有一个stage 对象,它包含屏幕上显示出的所

有对象。实际上stage 是一个容器,可以通过引用stage属性来访问任何可视化对象。

可视化对象容器

可视化对象容器包含其他可视化对象,stage 就是个可视化对象容器。其他的可视化对象容器包

括Sprite, MovieClip, 和Shape。当一个可视化对象容器被删除时,它包含的所有子对象都将被

删除。

可视化对象

可视化对象就是一个可显示的元素。有两种一种是可视化对象容器,比如MovieClip,另外是可

视化对象,比如一个TextField。可视化对象创建后不会立即被显示出来,只有被添加到可视化

对象容器后才被显示。

可视化对象列表进行了以下方面的改进:

提高了性能

可视化对象列表除了MovieClip还包含了多个可视化类。如Sprite 可以减少内存需求,另外Shape

可以代替MovieClip 实例进行绘画。用这些轻量级的类节省了内存和资源,提高了性能。

更容易的层级管理

新的可视化对象列表模型增加了层级管理功能。在以前的版本中,通过调用

getNextHighestDepth( ) 在当前位置创建MovieClips,swapDepths( ) 控制层级顺序。这种层级管

理是非常不合理和不灵活,写程序时也要非常小心。新的可视化对象列表模型直接自动处理了

这个问题,彻底摆脱了手动层级管理。

灵活的结构

原来的模型结构非常死板和不灵活,要修改层级, MovieClips 必须删除然后再在新位置创建,

这简直是在浪费时间,也直接导致了运行速度下降。新的显示模型具备高灵活性,可以随意移

动元素到任何位置而不需要删除再创建。

创建可视化对象更容易

新的渲染模型更容易创建可视化对象,特别是自定义可视化类的创建。之前的模型需要扩展

MovieClip,再连接指定的类库。attachMovie( ) 只能用来创建自定义类实例。新的模型,可以扩

展更多的可视化类,这些将在第6.4节讨论。

flash.display 包包含了核心的可视化类,老的模型的核心类是MovieClip,现在DisplayObject 类

顶级可视化类以及它的各种子类。

 

怎样添加一个新的可视化对像到可视化列表中,让它显示在屏幕上?

用DisplayObectContainer 类的addChild() 和 addChildAt() 方法

Flash Player是由两个主要部件的功能,共同组成一个单位, actionscript的虚拟机(AVM)和渲染引擎. AVM负责执行actionscript代码,渲染引擎是绘制对像在屏幕上. 因为Flash Player是由这两大块, 绘图对像在屏幕上有两个步骤:

1.  可视化对像需要被建立在AS 引擎中

2.  可视化对像然后被在渲染引擎建立和被绘制在屏幕上

第一步是用 new 操作符来建立一个可视化对像的实例完成的。任何准备被添加在可视化列表中的对像必须是 DisplayObject 的直接或者间接的一个子类,像 Sprite,MovieClip,TextField,或者一个自定义类,建立一个 TextField 实例,你需要使用如下的代码:

var hello:TextField = new TextField();

上面一行的代码,在AVM中建立一个 TextField 可视化对像,但是对像没有被绘制在屏幕上,因为对像在渲染引擎中不存在。为了在渲染引擎中建立对像,对像需要被添加到可视化列表中,可以调用 addChild()或者 addChildAt()方法来完成,因为它们是DisplayObjectContainer 实例的方法,它本身已经在可视化列表层级中了。

addChild()方法带有一个单独的参数:可视化对像,下面有一个完整的代码,示范了怎么样在AVM中建立一个对像和在渲染引擎中建立对像,添加它到可视化列表中:

package {
  import flash.display.DisplayObjectContainer;
  import flash.display.Sprite;
  import flash.text.TextField;
 
public class DisplayListExample extends Sprite {
    public function DisplayListExample(  ) {
      // Create a display object in the actionscript engine
      var hello:TextField = new TextField(  );
      hello.text = "hello";
     
      // Create the display object in the rendering engine
      // by adding it to the display list so that the
      // text field is drawn on the screen
      addChild( hello );
    }
  }
}

这里的 DisplayListExample 类是主程序类,它扩展至Sprite类,

一个TextField 可视化对像被建立在 DisplayListExample 构造函数中,在AVM内部建立对像。在这里,对像不会出现在屏幕上,因为渲染引擎至今不知道它,它只在对像被添加在可视化列表后,通过调用 addChild()方法显示TextField。

注意:addChild() 和 addChildAt() 方法只添加可视化对像,作为可视化对像容器的孩子。它们没有必要添加可视化对像到可视化列表中。孩子们只被添加到可视化列表中,如果容器它们被添加,同样地,添加到可视化列表。

下面的代码片断示范了 addChild()方法怎么样不保证一个可视化对像被添加到可视化列表中。建立一些文本在一个容器里面,但是因为容器没有在可视化列表中,文本不会显示:

// Create a text field to display some text
var hello:TextField = new TextField(  );
hello.text = "hello";
// Create a container to hold the TextField
var container:Sprite = new Sprite(  );
// Add the TextField as a child of the container
container.addChild( hello );

为了让文本显示在屏幕上,文本容器需要被添加到可视化列表中。完成这个,需要一个可视化容器已经在可视化列表中,像 root 或者 stage,调用 addChild(),传递 文本容器可视化对像给它。

//Cast the special root reference as a container and add the
// container that holds the text so it appears on-screen
DisplayObjectContainer( root ).addChild( container );
 
package {
   import flash.display.*;
   public class DisplayListExample extends Sprite {
     public function DisplayListExample(  ) {
       // 建立不同颜色的圆
       // change their coordinates so they are staggered
       // and aren't all located at (0,0).
       var red:Shape = createCircle( 0xFF0000, 10 );
       red.x = 10;
       red.y = 20;
       var green:Shape = createCircle( 0x00FF00, 10 );
       green.x = 15;
       green.y = 25;
       var blue:Shape = createCircle( 0x0000FF, 10 );
       blue.x = 20;
       blue.y = 20;
      
       // Create a container to hold the three circles, and add the
       // circles to the container
       var container1:Sprite = new Sprite(  );
       container1.addChild( red );
       container1.addChild( green );
       container1.addChild( blue );
      
       // Add the container to the display list
       addChild( container1 );
      
       // Create a second container and add it the display list
       var container2:Sprite = new Sprite(  );
       addChild( container2 );
      
       // Reparent the red circle from container 1 to container 2,
       // which has the net effect of the red circle being drawn
       // on top of the green and blue ones.
       container2.addChild( red );
     }
    
     // Helper function to create a circle shape with a given color
     // and radius
     public function createCircle( color:uint, radius:Number ):Shape {
       var shape:Shape = new Shape(  );
       shape.graphics.beginFill( color );
       shape.graphics.drawCircle( 0, 0, radius );
       shape.graphics.endFill(  );
       return shape;
     }
   }
 }

作者: 我不是鱼   发布时间: 2010-11-27