【语言基本元素】
能用整数优先用int uint,有正负之分,用int。只处理整数,用uint,有小数,用Number
必须声明初值,否则容易出错
typeof,用字符串返回对象类型,格式: typeof(对象)
is ,判断操作符左边的对象是否属于右边的类型,返回值为Boolean,格式: 对象 is 数据类型
as ,判断操作符左边的对象是否属于右边的类型,属于则返回数据,不属于则返回null,格式: 对象 as 数据类型
typeof对象类型与返回结果对照表
对象类型 返回结果
Array object
Boolean boolean
Function function
int number
Number number
Object object
String string
uint number
XML xml
XMLList xml
in ,判断操作符左边的对象是否作为右边对象中的键(Key)或索引,返回值为Boolean
比如:
var a:Array = ["q","w","e"];
trace(2 in a); //数组中有索引2,返回true
trace(3 in a); //数组中没有索引3,返回false
AS2.0中可以删除任意任意对象的delete关键字,在AS3.0中只能用于删除对象的动态实例属性,非动态属性不能删除。
如果要将一个对象删除,使用 对象名 = null 来进行赋值操作即可。
【流程控制】
break和continue标签的特殊用法
在循环语句前用 标签: 的形式为循环体赋标签,然后就可以在break和continue语句后 加上空格+这个标签,实现控制对应循环的功能。
AS3.0中switch比较默认使用 === 全等比较,switch条件不会自动执行类型转换,要注意
【函数及高级使用技巧】
函数默认参数
function 函数名(形参:类型 = 默认值)
形式参数数组
函数中默认自动生成的arguments对象中保存有所有定义中的形参参数
AS2.0中的arguments数组形参对象,存放所有传入的不定个数的形参参数。
而在AS3.0中,argument则被严格限定存放形参定义中所定义个数的形参。
arguments对象有一个length属性和一个callee方法。
function 函数名(形参:数据类型,形参:数据类型){
trace(arguments.length)
arguments.callee //调用函数本体,一般用于创建递归
}
如果需要传入任意多个参数,则使用AS3.0中的rest关键字,即 ...
特殊关键字 ...(rest)
function 函数名(...参数名){ //参数名可随意定义
trace(参数名.length)
}
最后要注意的,arguments与...rest关键字不能混用,使用了...rest则arguments则不能再使用
【类和对象】
类名统一用大写字母开头,包路径统一用小写
类体结构安排:
package [包名]{
import 类包;
public class 类
{
//private 静态属性
//private 静态方法
//private 实例属性
//构造函数
//实例方法
//静属 静方 实属 构函 实方,声明类内数据的五个顺序
public function 构造函数(){
//函数代码
}
}
}
5.6 实例属性和实例方法
实例属性和实例方法类似于动态网页语言中的session,不同的类实例(对象)中的实例属性可以有不同值 。
5.6.1 实例属性
访问控制符 var 属性名:数据类型;
访问控制符 var 属性名:数据类型 = 值;
访问控制符可以是 internal public private protect 或者自定义的namespace标识
默认为internal - 包内成员可以访问,包外不可访问
5.6.2 实例方法
访问控制符 function 方法名(形参):返回值类型{
//方法内容
}
5.6.3 访问实例属性和实例方法
使用new 语法实例化对象后,
对象.属性|方法名
5.7 静态属性和静态方法
静态属性和静态方法类似于动态网页语言中的Application,不同的类实例(对象)间共享类中共同的属性和方法。
声明静态属性:
static var 属性:数据类型;
static var 属性:数据类型 = 值;
public static var 属性:数据类型;
public static var 属性:数据类型 = 值;
不加访问控制符时,默认同样是internal
如果要声明静态常量,需要配合使用 static 和 const
static const 属性:数据类型 = 值;
静态方法:
同样是使用static关键字
访问控制符 static function 方法名(形参):返回值类型{ //方法内容 }
5.7.3 访问静态属性和静态方法
类名.属性
类名.方法
例:Math.floor,Math.PI
为了避免与类内成员变量冲突,访问静态属性及方法时,即使在类体内访问也最好用 类名.属性 这样的格式来写
应用1:使用静态属性集中管理数据,public static const PI:Number = 3.141592653589793;
应用2:使用静态属性部分实现Enumeration(枚举)
应用3:实现工具类,如:Math String等类
5.8 构造函数
定义:构造函数用于创建对象时供系统自动调用的函数,实现数据的初始化操作
格式:
public 类名(形参){
//构造函数名与类名相同,首字母大写,以与其它函数等区分
//形参中同样可以使用...rest运算符载入不同个数的参数,实现类似重载的功能
}
5.8.3 构造函数的返回类型
构造函数只能返回undefined值,所以return没意义。
但return可以影响构造函数向下执行代码的顺序,遇到return时,其下的代码将终止执行。
5.9 Clas的种类:动态类和密封类
密封类在运行时不能动态添加属性或方法。
动态类在运行时可以动态添加属性或方法。
默认声明的类为静态类,动态类在class关键字前有 dynamic 关键字
注意:AS3.0中的 for...in循环, for each...in循环只能遍历动态类对象的动态属性
5.12 含有多个类的ActionScript3 类文件的标准例子
(1)每个AS3的Class都必须写个一个和类同句的.as文件中
(2)package包体括号内只能定义一个Class
(3)在package包体中定义的Class,必须与类文件名相同
(4)在package包体括号外还可以定义其它类,这种类,叫包外类,只能被当前as文件中的成员类访问
【as3中的封装:类的成员、类、包与访问控制】
总之,尽量将类成员的访问权限控制到最低限度,这才能给日后的修改、维护代码带来最大的自由。
访问控制说明符从“毫无限制”到“严格限制”的顺序是:
public 完全公开
protected 在private的基础上,允许子类访问
internal 包内可见
private 类内可见
6.3 ActionScript3中封装的几个层次
包外 -> 包 -> 类 -> 包外类 (由外层到内层的结构,越靠近内近,访问权限越严格)
包外:相当于公共权限,任意第三方都可以访问到其中的代码单元。
包(package):包内的成员互相可以访问,但包内的成员不能被包外的成员访问到。
类(class):一个包中可以包含很多个类,在类的内部,类的成员可以相互访问,但外部是没有办法访问到类的私有成员的。
包外类:这是最底层的类,在package语句外定义,只能被当前类中的成员访问,类似只能被当前类调用的私有函数。
6.4 package(包)
package用于划分访问控制和实现模块化功能。
6.4.1 包的导入(import)
使用任何一个类之前,必须先导入这个类所在的包,即使使用 全饰路径,也必须先导入包。
在Flash CS3文档时间轴上写代码时,flash.*默认是自动导入的,可不用手动import
1.导入单个类
import 包路径;
2.使用通配符导入整个包
使用*号可以快速导入指定包的所有类,但一般为了程序的清晰,建议少用,而是直接写清楚导入类的包名
import 包路径.*;
3.使用同一个包内的类文件无须导入
如果导入的不同包中有同名的类,则需要在声明使用时使用全饰路径,即:new 完整包路径.类名();
6.4.3 package的创建和命名
业界习惯是使用域名来定义包路径
比如 com.kinda.book.display
如果没有,也可以使用自己的电子邮箱
比如 com.21cn.kinda.book.display
在项目工程目录下 建立 com文件夹,在com文件夹建kinda文件夹,在kinda文件夹内建book文件夹
使用系统目录形式来实现包的管理
创建包的过程:
1.选好包名,一般以域名段倒写为前缀;
2.在硬盘上根据定好的包名结构创建对应的目录结构
3.在包中创建的任何类,头部package定义中必须写上包路径
修改包结构的时候有三点要做:
1.移动包目录
2.修改包中类头部 package中的包名
3.修改相应import类中的包名
6.5.1 类路径
Ctrl+U > ActionScript > ActionScript 3 Settings...
在此可添加系统类包路径,供全局调用。
6.6 类成员的访问控制
AS3中有四种访问控制符:
public
private
internal
protected
访问控制符不仅控制实例属性和方法,对静态属性和方法也有同样的作用。
6.6.1 internal:包内访问
AS3中所有类成员在没加访问控制符的情况下,都为默认的internal权限,
可以被同一个包内的其它类成员访问
6.6.3 private:仅当前类可访问
private修饰的类的成员,称为私有成员(private member),除了类体内可以访问外,包内的其它类和继承的子类等都不能访问私有成员。
对于复杂数据类型(比如数组等)的属性来说,private只能限制通过当前类的实例来访问,但不能限制这个属性所指向的引用对象本身的访问。
6.6.4 protected:子类可访问
protected修饰的对象只能被当前类和当前类的子类对象访问,等同在private基础上增加对子类的支持。
protected修饰的子类不受包的限制,可以在不同类中,如果不是当前类子类,那和private是一样的。
6.7 getter和setter方法
封装的意义就是不想用户直接访问类内的数据,而使用getter和setter则是一种折衷的办法,当用户需要设置对象属性的时候,通过setter函数对传入数据进行验证,然后再赋值给对象,确保了数据的完整性
6.8 类(Class)的访问控制
internal(包内可见)和public(包外可见)两种
6.9 包外类
包外类是类的私有单元,在package代码体外定义。
调用时,如果包中有同名类,则优先调用包外类。
复合和继续的核心思想是重用现有的代码。
【核心类和全局函数】
核心类和全局函数就是处于顶级包中的类和函数,它们处于顶层,在顶级包 (Top-Level Package)中
ActionScript3处于顶级的核心类只有28个,全局函数仅21个,另加全局常量4个
11.2 核心类的数目和列表
核心类:(28个,7类)
根类:Object
语言结构:Class(类)、Function(函数)、Namespace(命名空间)、arguments(参数数组)
基本类型:int(有符整形)、Boolean(布尔)、Number(浮点)、String(字符)、uint(无符整型)
常用复杂类型:Array(数组)、Date(日期)、RegExp(正则)
XML相关类:XML()、XMLList()、Qname()
异常类:Error(异常)共11个异常类
工具类:Math(数学)
全局函数:(6类)
类型转换函数:Array,Boolean,int,Number,Object,String,uint,XML,XMLList
URI编码解码:decodeURI,decodeURICompnent,encodeURI,URIencodeURIComponent
URL编码解码:escape,unescape
判值函数:isFinite,isNaN,isXMLName
字符串转值函数:parseFloat,parseInt
控制台输出函数:trace
================================================
第12章 数组:Array
================================================
12.1 数组(Array)的介绍
ActionScript3中的数组(Array)是以非零整数为索引的稀疏数组(sparse array).所谓稀疏就是指数组元素可以是不同数据类型,不支持类型化数组(typed array).
12.1.1 访问数组元素
数组索引从0开始
12.1.2 数组的长度
ActionScript3的数组是可变长度数组,可以使用数组的length属性访问数组长度
1.使用length属性可以返回数组长度
2.向length属性赋值,将改变数组的长度,超出当前元素的部分会使用空值作填充
3.向超出数组length值的索引赋值时,数组会自动增加长度,中间部分会用空值作填充
4.向length属性赋值时,如果低于当前length值,则减少的数组索引将被自动删除
12.2 数组(Array)的基本操作
增、删、查、改、排序
12.2.1 查找:indexOf、lastIndexOf
查找元素,找到就返回索引位置,如果找不到,返回-1
indexOf 从左到右
lastIndexOf 从右到左
indexOf/lastIndexOf(查找元素[,查找起始位置])
查找时使用的是 === 全等于条件,不作数据类型自动转换,所以 "123"与123是不同的
12.2.7 数组的浅复制与深复制
浅复制就是说只是复制引用,操作对应对象时还会影响引用的对象。
一般调用数组的slice或concat函数时,不传入参数,都可以生成浅复制对象
深复制不是生成复制对象的一个副本,所有对返回对象的操作,都不会影响到原始对象,是完全复制。
深复制使用ByteArray类
var BA对象:ByteArray = new ByteArray();
BA对象.writeObject(源对象);
BA对象.position = 0;
var 备份对象:Array = BA对象.readObject() as Array;
12.3 操作数组每个元素:forEach、every、filter、map、some
================================================
第13章 字符串:String
================================================
13.2.2 运用formCharCode() 根据Unicode码返回字符
formCharCode:根据传入的数值返回对应字符
这是String类的静态属性
String.formCharCode(Unicode码[,Unicode码])
多个Unicode码可用逗号分隔
例如:
String.formCharCode(27583,22530,20043,36335O); //返回 殿堂之路 四个字
String.formCharCode(0x41,0x53,0x33); //返回 AS3 ,这里用了16进制值
13.6.4 使用XML对象实现输入不规则文本
var XML对象:XML = <标签>标签>
XML对象.toString();
//通过XML对象的toString方法就可以得到完整代码了
trace(XML对象.toString())
13.7 实用的mx.utils.StringUtil工具类
import mx.utils.StringUtil
StringUtil.trim(str:String):void 去除两端空白
StringUtil.s stitute(str:String,...rest):String 替换字符串
================================================
第18章 事件发送和处理
================================================
18.1 事件(Event)处理机制的产生和原理
客人就是事件发送者(Event Dispatcher)
点菜就是客人发送的事件(Event)
服务生就是事件侦听者(Event Listener)
18.1.2 DOM3事件的执行流程机制包含4个步骤:
注册侦听器、发送事件、侦听事件、移除侦听器,按顺序执行的。
注册侦听形式统一,使用事件侦听统一使用addEventListener()
侦听器统一使用function,不再允许Object当侦听器
所发送的事件对象,必须是Event或其子类的实例
================================================
第19章 网络通信基础
================================================
标准的加载方法:
var URL路径:String = "URL地址";
var URLRequest对象:URLRequest = new URLRequest(URL路径);
var URLLoader对象:URLLoader = new URLLoader(URLRequest对象);
提交的数据放在URLRequest对象中,读取到的数据放在URLLoader对象中。
对于URL中的值对操作,要使用URLVariables类处理。
var 值串对象:URLVariables = new URLVariables("name=foo&age=28&sex=male");
var URLRequest对象:URLRequest = new URLRequest();
URLRequest对象.url = "动态网页URL";
URLRequest对象.method = URLRequestMethod.GET; //数据格式
URLRequest对象.data = 值串对象; //将URLVariables赋给data属性
XML数据:
var XML对象:XML = XML文本
var URLRequest对象:URLRequest = new URLRequest();
URLRequest对象.url = "动态网页URL";
URLRequest对象.contentType = "text/xml";
URLRequest对象.data = XML对象.toXMLString(); //将xml转成文本赋给data属性
URLRequest对象.method = URLRequestMethod.POST;
19.1.2 发出数据请求
发出数据请求,需要按照数据请求对象携带的信息,向指定地址发出请求,这部分由URLLoader对象来完成。
var URLLoader对象:URLLoader = new URLLoader(URLRequest对象); //定义后立刻发送数据
var URLLoader对象:URLLoader = new URLLoader();
URLLoader对象.load(URLRequest对象); //调用URLLoader对象的load后才发送数据
如果有数据返回,数据将放在URLLoader对象的data属性中,dataFormat属性则包含返回数据类型的值
dataFormat属性支持三个常量值:
文本型(URLLoaderDataFormat.TEXT)
二进制(URLLoaderDataFormat.BINARY)
值串对(URLLoaderDataFormat.VARIABLES)
19.3 getURL()的继承人:navigateToURL()
import flash.net.* //使用前要导入net包
navigateToURL(URLRequest对象:URLRequest[,window:String = null])
URLRequest对象 = 网址
window = 打开窗口的方法 _self _blank _parent _top
标准语法:
var URLRequest对象:URLRequest = new URLRequest(URL地址);
navigateToURL(URLRequest对象,"_blank");
或者
navigateToURL(new URLRequest(URL地址),"_blank");
19.5.2 跨域文件:crossdomain.xml
一个放置于网站根目录的文件,用于允许被访问的域。
19.5.3
可临时在swf内部设置允许访问的域
Security.allowDomain() 授权访问域
Security.allowDomain(URL域)
Security.allowDomain("*")
Security.allowDomain("*.baidu.com")
┏━━━━━━━━━━━━━━━━━━┓
┃ 第五部分:ActionScript 3 视觉编程 ┃
┗━━━━━━━━━━━━━━━━━━┛
================================================
第20章 ActionScript 3 视觉编程精要
================================================
20.1 什么是显示对象
在舞台上显示的对象,在AS3中统一被称为显示对象(Display Object)
显示对象除了包含能看得见的显示对象外,也包括不能看见但却真实存在的显示对象容器(Display Object Container)
20.1.1 ActionScript3 中显示对象等级结构
舞台(Stage)
当前SWF(文档类或MainTimeline)
容器
显示对象
20.1.2 显示列表:显示对象模型
AS3中所有显示对象归使用显示列表(Display List)的方式进行管理,只有在列表中列出的对象才会在舞台上显示。
显示对象有两种:在显示列表中(on-list)和不在显示列表中(off-list),在显示列表中的对象会被渲染,不在显示列表中的对象依然存在,不被渲染罢了。
20.2 ActionScript3中显示对象的种类
20.1 ActionScript2中的MovieClip
MovieClip是万能的,但缺点是一旦创建,就拥有了一大堆时间轴等属性,非常浪费资源,有时候只将它作为空白容器。
MovieClip的地位在AS3中减弱了很多。
20.2.2 ActionScript3显示对象种类划分:一个统一、两个层次
一个统一,AS3中所有显示对象都统一于DisplayObject类
第一大层次:是否可以接受互动事件,可以接受的,称为 可互动的显示对象(InteractiveObject);
不可以交互的,称为非互动显示对象.
可互动的显示对象(InteractiveObject):指能够接受鼠标单击、键盘敲击等人机交互事件。
位图、形状、视频等就不能接受这些事件,所以归入不可以交互类。
第二大层次:是否可以作为容器,可以容纳其它显示对象的,称为 显示对象容器(Display Object Container)
20.3 显示对象类库架构
以下很好反映了 一个统一、两个层次 这个概念
所有显示对象都是继承自父类DisplayObject这个抽象类,而父类DisplayObject则继承自EventDispatcher类,
说明所有显示对象都能发送事件。
DisplayObject、InteractiveObject、DisplayObjectContainer是显示对象架构中的三个核心对象,
它们都是不能被实例化的抽象类
视觉架构类图:
EventDispatcher(事件类)
┃
┃
根类 DisplayObject(抽象类,不允许实例化,只能实例化子类)
┃
┃
InteractiveObject(可以交互)━━━━━━ (不可以交互) ┏ Bitmap(位图) - Shape(容器)
┃ ┣ Video(视频) - AVM1Movie(AS1.0 2.0影片)
┃ ┗ [StaticText(静态文本框)* - MorphShape(形状补间)*]
┃ 有*的为必须在舞台上手动创建
┃
┃
DisplayObjectContainer(可以作为容器) ━ (不可以作为容器) [SimpleButton(简单按钮) - TextField(文本框)]
┃
┃
┃
Sprite(简单容器,简化版MovieClip) ━━ Stage(舞台) - Loader(加载)
┃
┃
┣━━━━━━━━━━━━━ mx.core.FlexSprite - mx.core.UIComponent(Flex)
┃
┃
┗━━ MovieClip(影片剪辑)
┃
┃
┗━ mx.flash.UIMovieClip
20.3.1 InteractiveObject类和非InteractiveObject类
InteractiveObject类 可以接受人机交互事件
非InteractiveObject类 不可以接受人机交互事件
不可以接受人机交互事件的类中有6个同级对象 :
AVM1Movie、Bitmap、MorphShape、Shape、StaticText、Video
其中再细分 MorphShape 和 StaticText不可以用代码创建
StaticText是Flash编辑环境下用文本工具创建的
MorphShape是在flash中创建形状渐变时自动生成的
AVM1Movie: Actionscript Virtual Machine1(ActionScript虚拟机1),即使用AS1.0 AS2.0创建的Flash影片,
为了向下兼容,当载入使用以上版本AS创建的影片时,会自动创建这个类,以同AVM2区分开来。
20.3.2 容器类和非容器类
第二层是InteractiveObject类的对象
包含三类,使用容器与非容器的概念来区分。
容器:可以在它里面加载其它的DisplayObject的容器
非容器对象:TextField、SimpleButton
TextField就是动态文本框
SimpleButton是Flash API
剩下的就是DisplayObjectContainer(显示对象容器)类,其下有:
Sprite、Loader、Stage
Stage是舞台类
Loader是原有MovieClip中加载外部资源的方法集合。
20.3.3 Sprite 和 MovieClip
Sprite将是我们在AS3中接触最多的容器,可以把它理解成去掉时间轴的MovieClip。
Sprite中含有Graphic对象,可以像MovieClip那样直接在自身绘图,但Sprite不同于Shape,
区别在于Sprite是容器,而Shape不是。
MovieClip是Sprite的子类,只保留了一些与时间轴控制相关的gotoAndStop方法和currentFrame属性等。
20.3.4 非Flash API的几个显示对象类
需要在Flex中使用到的显示对象,必须是UIComponent类的子类或实现IUIComponent的接口(Interface)
20.4 ActionScript3 视觉架构的优越性
20.4.1 更高效的渲染,更好的内存利用
AS3中影片剪辑被弱化成
绘制矢量使用轻量的Shape对象,
需要容器使用轻量的Sprite对象,
降低了时间轴的使用,也同时降低了内存的浪费。
20.4.2 自动化的深度管理
AS3中的显示对象深度由程序自动管理。
每个DisplayObjectContainer实例都有numChildren属性,用于显示对象容器中的子对象数目
显示对象容器列表中对象的索引从0开始,到numChildren-1
20.4.3 完整遍历显示列表
在AS3中,可以访问显示列表中的所有对象,包括使用ActionScript创建的对象及在IDE中绘制的对象。
20.4.4 列表外的显示对象
只有在显示列表中的对象才会被显示在舞台上,添加到显示列表的方法是调用addChild()或addChildAt()
================================================
第21章 DisplayObject类与矢量图、位图
================================================
21.1.1 显示对象的可视属性列表
AS3中所有原有对象的属性前面的下划线都去掉了,直接使用字母 ,比如 _x _y _alpha 之类变成x y alpha
注意的是:
scaleX scaleY alpha 之类原来0-100的值,在AS3中变成了0-1,其中的百分比使用小数
显示对象基本有11个可视属性(共有25个):
x、y、width、height、scaleX、scaleY、mouseX、mouseY、rotation、alpha、visible
21.1.2 显示对象的其它属性
显示对象除了11个可视属性外,还有5个常用属性和9个不太常用的属性。
除此之外,DisplayObject还拥有6个实例方法,能发出6种事件。
5个常用属性:
name: 显示对象名字,与AS2不同的是,创建对象时,name会自动分配
parent: 父容器,指向显示列表的父容器,当显示对象不在显示列表中时,该属性为null
root: 返回当前SWF主类的实例引用。
stage: 舞台
mask: 遮罩,指向用来遮罩的对象。
21.2 所有显示对象的抽象父类:DisplayObject类
DisplayObject类是一个不能被实例化的抽象类,也不能创建直接继承DisplayObject的子类,而只能继承自DisplayObject具体子类
DisplayObject类具有7个子类,分成两类,一类是InteractiveObject抽象类,
另一类是非InteractiveObject类的六个具体类,这六个类都是直接继承自DisplayObject类,不是InteractiveObject的子类,
因此不能接受鼠标事件,也不会发出人机交互事件。
21.3 矢量图
Shape类是最简单的DisplayObject类型,与父类不同的是它多了一个graphics的实例属性,这个属性持有Graphics类对象的引用。
21.3.1 Graphics对象
Graphics对象只能由AS3内建的显示对象创建并调用,所有的矢量图形代码绘制均使用它创建。
Graphics对象并不是显示对象类,而是直接继承自根类Object。也没法用代码创建Graphics对象。
Graphics对象绘制方法分类(详细见P341 或帮助 flash.display > Graphics 相关方法 属性)
使用代码绘图时,一般遵从顺序:设置线头样式、填色、移动绘画点、画线或绘制图形、结束填色(endFill())。
设置线头样式、填色都是可选的。
只要含有Graphics的显示对象都可以绘制矢量图。
AS3中拥有Graphics对象的DisplayObject子类有3个:Shape、Sprite、MovieClip,Shape只支持纯矢量图,Sprite可以容纳矢量图与其它对象。
21.3.2 绘制矢量图的例子
var 显示对象:Shape = new Shape();
显示对象.graphics.beginFill(0xff0000);
显示对象.graphics.drawCircle(100,100,40);
显示对象.graphics.endFill();
addChild(显示对象);
21.4 位图
21.4.2 Bitmap和BitmapData
位图的所有像素信息存储在Bitmap对象的BitmapData属性持有的BitmapData对象中,
Bitmap对象不是显示对象,它直接继承自Object
BitmapData对象可以看成是一个特殊数组(二维数组),其中存储的每个一个颜色值,是一个32位的ARGB值
A,alpha透明度, 值从0x00-0xFF , ARGB组合的值就是 0xFF00000 共8位16进制值。
BitmapData对象记录的像素ARGB值是直接提交Flash Player渲染的,所以直接改变BitmapData中的像素信息,就可以改变舞台上的位图对象。
21.4.3 使用BitmapData 创建和改变位图
import flash.display.BitmapData;
import flash.display.Bitmap;
21.5 遮罩
21.5.1 定义普通遮罩
设置显示对象的mask属性,即可定义遮罩。
显示对象.mask = 遮罩对象; //设置遮罩
显示对象.mask = null; //撤消遮罩
遮罩对象不需要一定在显示列表中的对象,但如果需要实现遮罩跟随场景缩放,用户调整大小等操作,必须要在显示列表中。
21.5.2 定义Alpha通道遮罩
要使用Alpha通道遮罩,遮罩和被遮罩的对象都需要使用位图缓存。
另外,遮罩对象需要具有Alpha透明通道渐变的信息才可以。
使用滤镜或者Graphics对象的渐变填充方法都可以创建具有Alpha透明通道渐变的信息的图形。
设置显示对象使用位图缓存:
显示对象.cacheAsBitmap = true;
21.6 文本
与文本相关的所有类在flash.text.*包中,动态文本框由TextField类实现。
创建文本框只需要 new一个TextField类的实例即可
使用type来决定文本框是属于动态还是输入,
type=TextFieldType.DYNAMIC
输入文本框
type=TextFieldType.INPUT
21.6.2 捕获HTML文本超链接的信息
HTML文本框中的超链接链接
文本框.addEventListener(TextEvent.LINK,侦听函数)
24.6.3 在文本框中追加文本请使用高效率的 appendText()
在AS3中使用appendText替代原来的+=添加字符串
文本框.appendText("追加的字串")
文本的规模越大,appendText的效率优势越明显。
21.7 碰撞检测
hitTestObject(obj:DisplayObject):Boolean 检测是否与某个显示对象(obj)碰撞。
hitTestPoint(x:Number,y:Number,shapeFlag:Boolean=false):Boolean
检测是否和某个舞台坐标点发生碰撞,其中shapeFlag定义的是检查显示对象的实际像素(true),
还是检查显示对象的边框(false).
21.8 自定义显示对象类
创建的自定义显示对象类,必须继承自DisplayObject的具体子类。
所谓子类,即排除DisplayObject、InteractiveObject、DisplayObjectContainer 三个抽象类,
这三个类都没提供在屏幕上渲染自身的API,因为自定义显示对象必须要继承自这三类的具体子类。
根据需求考虑继承Shape、Bitmap、Video中的某个类。在实际编程中,以继承Shape最为常见。
===========================================================
第22章 容器: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遍历
===========================================================
第23章 Flash CS3:库元件的类绑定与
===========================================================
23.1 类绑定的好处、原理和第一个例子
类绑定使元件由原来只可以使用attachMovie、createEmptyMovieClip等创建实例的途径,变成可以直接使用new 类名()的类。
23.1.1 第一个类绑定的例子:自定义标签按钮