【语言基本元素】 能用整数优先用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 第一个类绑定的例子:自定义标签按钮