action script3.0可视化列表学习
时间:2010-11-27
来源:互联网
我在学习as3可视化列表时遇到一个印象深刻的问题:可视化对象和可视化对象容器的区别。容器是能用来装东西的,而对象则不一定。例如,Movieclip可以是对象也可以是容器,但textfield等只能是对象。
当对象被嵌套在多个容器中,要根据名称使用getChildByName()方法获取特定影片剪辑时,如果根据层级用点语法连写,则很容易出错。在应用方法的时候,要看清楚其返回类型。
比如:
则会报错.
因为getChildByName()方法返回的是“对象”而不是“容器”,为此,必须进行必要的转化,MovieClip是可以作为容器的。
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 实例,你需要使用如下的代码:
上面一行的代码,在AVM中建立一个 TextField 可视化对像,但是对像没有被绘制在屏幕上,因为对像在渲染引擎中不存在。为了在渲染引擎中建立对像,对像需要被添加到可视化列表中,可以调用 addChild()或者 addChildAt()方法来完成,因为它们是DisplayObjectContainer 实例的方法,它本身已经在可视化列表层级中了。
addChild()方法带有一个单独的参数:可视化对像,下面有一个完整的代码,示范了怎么样在AVM中建立一个对像和在渲染引擎中建立对像,添加它到可视化列表中:
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()方法怎么样不保证一个可视化对像被添加到可视化列表中。建立一些文本在一个容器里面,但是因为容器没有在可视化列表中,文本不会显示:
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(),传递 文本容器可视化对像给它。
// 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
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28