本读书笔记根据孙毅的《Flash ActionScript 3殿堂之路》整理而成。全书分成五个部分:(1)ActionScript3语言基础(2)ActionScript3面向对象编程(3)ActionScript3核心类(4)ActionScript3主要的Flash Player API(5)ActionScript3视频编程。本读书笔记应该掌握的知识而采用问答的方式进行整理。
1.ActionScript 3中的数据类型有哪几种类型?
答:ActionScript 3的数据类型分为基元数据类型和复杂数据类型。ActionScript 3中预定义的基元数据类型一共有:Boolean,int,Number、String和unit。经常用到的ActionScript 3复杂数据类型有:Array、Data、Error、Function、RegExp、XML和XMLList。我们自己定义的类也全部属于复杂数据类型。
2.值类型和引用类型的区别?
答:值类型直接存储值;而引用类型存储引用,指向要操作的对象。ActionScript 3中值类型只有Boolean、int、Number、String和unit这几种,其余的数据类型就全是引用类型。还有一个典型的特征:值类型的数据不用new关键字来创建;必须使用new关键字创建的一定不是值类型。值类型和引用类型的行为有这么大的区别原因就在于,引用类型数据储存的是引用。在ActionScript 3中,值类型变量持有的是指向值类型数据的引用;引用变量持有的是指向引用类型数据的引用。
3.在ActionScript 3中关键字...(rest)的作用?
答:为了提供传入任意参数的灵活性。只要在参数中定义了...(rest),那么就可以接受任意多的参数。这些参数,以数组形式保留在rest中。一旦使用了...(rest)关键字,那么arguments就不能再使用了。
4.静态属性和静态方法的特点?
答:静态属性和静态方法不依赖实例而独立存在。简单地说,即使不创建一个类的实例,我们也可以访问到该类的静态属性和静态方法。这一点就和实例属性、实例方法完全不同。
静态属性:存储所有对象共同的状态,和任何实例都没有关联。每个对象的实例属性值可以各不相同,但所有同类对象的静态属性值都是一致的。改变一个对象的实例属性不会影响另一个对象的实例属性值,但改变一个类的静态属性值则会影响该类所有对象。
静态方法:也是独立于所有实例的。静态方法只和每个类绑定,不和类的任何具体实例绑定。
静态方法和静态属性只是为每个类创建一次,在这个类被调用时创建。与类实例是否创建、创建多少次没有关系。
5.ActionScript 3一些特殊的知识点?
(1)final关键字可以避免类被继承而被改写。
(2)const将枚举成员定义为常量,一旦定义不再改写。
6.构造函数的特点?
答:在ActionScript 3中,创建对象时会自动调用构造函数;删除则是由垃圾回收机按照自己计划自动执行。
在ActionScript中,构造函数必须要和类名相同。如果在类中没有定义构造函数,那么编译器在编译时会自动生成一个默认的空的构造函数。
构造函数可以有参数,通过给构造函数传入参数来初始化成员是很常见的做法。
构造函数不支持重载,ActionScript 3中的方法都不支持重载。
在ActionScript 3中,构造函数只能使用public访问控制。private、protected、internal及其他所有自定义的命名空间都不能用于构造函数。
构造函数是一个特殊的方法,不能声明返回类型,必须留空。构造函数不会返回任何值,只有当new关键字加上构造函数一起使用时才会返回类的实例。
7.Class的种类?
答:从是否可以动态添加实例属性或方法,可以将类区分为动态类和密封类。动态类生成的实例可以在运行时动态添加实例属性,而密封类不可以。从语法上区分的话,如果类名前有dynamic关键字,那么这个类就是动态类;如果没有就是密封类。
8.this关键字
答:this关键字持有对当前对象的引用。
this关键字将各个实例属性和方法绑定在了当前对象中,所以,对象的状态才能在对象的内部逻辑中得以共享。
this关键字只限于实例属性和实例方法。因为this关键字必须要指代一个具体的实例,而静态方法和静态属性是不和任何实例相关联的。因此this关键字不能用在静态方法中,也不能用来访问静态属性。
this关键字在如下三种情况下会用到。
(1)向第三方提供对象自身的引用。
(2eturn结合,在类方法中返回自身的引用。
(3部变量、方法参数、静态属性同名时,加上this关键字明确指定使用实例属性。
9.封装
答:ActionScript 3中的封装包括:类的成员访问控制、包和类的访问控制、命名空间的使用。
封装又叫隐藏现实,具体的意思就是将实现的细节隐藏起来,只将必要的功能接口对外开放。
封装在代码中的一种表现:类的创建者只将类的功能性接口对外公开,而将其他细节设为私有,对外不公开。
好的OPP程序,没有流程执行先后的概念,只有代码单元之间如何相互交流和协同工作的模式。这些代码单元,又被称为模块。模块在代码中的表现形式是一个单独的类或多个类。
从更本上说,降低复杂度才是封装这个思想产生的最真实的原因。
10.4个常用的访问控制。
答:internal:如果一个类成员前面没有加任何访问控制符,那么将被默认为internal。它表示,只要是和当前类在同一个包中的其它类都可以访问这个类成员。但是,不属于同一个包的类是无法访问到这个类成员的。所以,internal,又可被称为包内访问。其实质是封装思想和package模块化思想的体现。
public:在类成员前使用public访问控制符,则是宣告在任何地方、任何对象都可以访问这个类成员。
private:private修饰的类成员,成为私有成员,除了当前类中的成员,所有其他类的方法都不可以访问到该成员,即使是同一个包中的类或扩展当前类的子类也不可以。对于复杂数据类型的属性来说,private的封装只是说不能通过当前类的实例来访问,并不意味着这个属性持有的引用所指向的对象不能被访问。private访问控制只是限制了直接访问实例私有成员,却不能阻止用引用来访问私有属性指向的对象。
protected:protected访问控制与类的继承有关。protected修饰的类成员只能被当前类和当前类的子类访问,protected的访问控制和package没有关系,即使当前类和子类不在同一个包中,也可以访问到protected类成员。
11.类的访问控制
答:在ActionScript 3中类的访问控制只有两种:包内可见internal(默认的)和包外可见public。
12.命名空间
答:引用命名空间的方式有两种:一种是使用use namespace指令打开命名空间,另一种是使用命名限定符“::”直接指定命名空间。
如果使用namespace在类体中定义命名空间,则命名空间不是依赖于每个实例的,而是相当于一种静态成员,属于整个类。
use namespace 编译时会被提前到前端。
use namespace指令不受上下文逻辑影响。
命名空间可以用于:(1)防止命名冲突(2)更灵活的访问控制(3)实现不公开的API。
13.何时初始化复合的对象?
答:有3种选择。(1)定义属性时就初始化复合对象(饿汉式初始化)。(2)在构造函数中初始化。(3)在使用对象时再初始化。
14.静态成员的继承。
答:在ActionScript 3中,类的静态成员不被子类继承。静态成员虽然不被子类继承,但是在子类中可以访问父类静态成员。父类的静态成员存在的范围链包括父类和其所有子类。
15.继承与重写。
答:在子类中,经常要改变继承自父类中的某个属性或方法中的内容,但不改变名称,从而达到子类同名方法实现不同功能的多态效果,这种方式叫做重写(Override)。
在ActionScript 3中,只能重写实例方法,不能重写实例属性。而静态成员由于不能被继承,如果要“重写”,可以直接在子类中定义同名成员。
被关键字final定义过的实例方法不能被重写,父类的private成员不能被重写。
要成功重写实例方法必须满足以下几个条件,缺一不可:必须用override关键字在行首标明这是重写;子类中被重写的方法要和父类的方法有同样的访问控制、同样的参数数目和参数类型、同样的返回值类类型。重写的方法中定义的参数名称不必与父类的方法相同。
不能重写实例属性,其主要意思是不能在子类中改变父类实例属性的类型。这是一种很好的保障,确保使用父类的地方都可以替换成子类,即确保强制转换始终有效。
16.简述里氏代换原则
答:使用父类对象的地方,一定可以适用于其子类对象,而不会感到使用方法上有什么区别。实际上,这就是著名的里氏代换原则(Liskov Substituion Principle,LSP)的简要表达。向上转换是里氏代换原则的必备条件,里氏代换原则是继承复用的基石。只有子类对象才可以真正替换掉父类对象,软件功能不受影响,使父类达到正真的复用。利用子类不断地在父类基础上增加新的功能。
里氏代换原则准确描述:在一个程序中,将所有类型为A的对象,都换成类型为B的对象,而程序的行为没有变化,那么类型B是类型A的子类型。注意,这里的类型不仅仅指类(Class),也包括接口(Interface)。
但要注意,里氏代换原则反过来不能成立,即使用子类对象的地方,不一定能替换成父类对象。
17.向下转换和向上转换
答:向上转换,是将子类的对象当成父类的对象来使用。向下转换的意思是,当一个子类对象以父类数据类型使用时,可以将它在还原成子类对象。
向上转换是安全的,向下转换是不安全的。
18.抽象类
答:在面向对象设计中,类分为具体类和抽象类两种。具体类就是可以生成实例的类,抽象类是不需要生成实例的类。
简单的说,当一个父类不需要生成自己的实例,只是用来继承时,这个类就是抽象类。
抽象类,代表着子类的一些共同特征和行为。
一个理性的继承架构设计中,所有的具体类都应该继承于抽象类。
设计抽象类要掌握以下两个原则:(1)抽想类应当拥有尽可能多的子类共同代码。即将子类共同的行为,尽可能移动到抽象的父类中去。这样代码的重用率会得到很大的提高。只要改动抽象父类的代码,所有子类的都会得到同样的改变。
(2)抽象类中的数据能少则少。子类的状态数据时,不应当存放于抽象的父类中。一方面会增大系统的开销,另一方面也会给日后的改变带来不必要的限制。
(3)抽象类中定义的抽象方法都必须在子类中重写。
19.接口
答:接口的实际意义是,接口仅包含一组方法声明,没有具体的代码实现。实现接口的类必须按照接口的定义实现这些方法,从而,实现同一个接口的类都具有这个接口的特征,接口如同协议,描述了实现接口的对象向外部的承诺。这样其他的对象就可以根据这个协议和实现接口的对象交流。
能够以其他数据类型向上转型,是接口的核心。
要根据接口编程,而不是根据实现来编程。
20.数组
答:ActionScript 3中数组(Array)是以非零整数为索引的稀疏数组。不要求所有元素统一类型,不支持类型化数组。
(1)数组.length:数组长度。
(2)目标数组.indexOf(要查找的元素):indexOf按照索引值从小到大查找,一旦找到就立刻返回索引值。如果没有找符合要求的元素,则返回整数值-1。
(3)目标数组.lastIndexOf(要找到的元素):lastIndexOf按照索引值从大到小查找,一旦找到就立刻返回索引值。如果没有找符合要求的元素,则返回整数值-1。
(4)目标数组.indexOf(要查找的元素,查找的起始位置):indexOf从起始位置开始向数组尾部查询。
(5)目标数组.lastIndexOf(要查找的元素,查找的起始位置):lastIndexOf则是从起始位置向数组头部查询。
(6)数组.push(元素):向数组尾部新增一个或多个元素。一个可以添加多个元素,元素之间用逗号隔开。
(7)数组.unshift(元素):在数组头部新增一个或多个元素。一个可以添加多个元素,元素之间用逗号隔开。
(8)数组.pop():不需要参数,用于将数组最后一个元素删除。返回值就是那个被删除的元素。
(9)数组.shift():不需要参数,将数组第一个元素删除,剩余元素索引值自动减1。返回值就是那个被删除的元素。
(10)splice方法可以删除数组当中的一个或多个连续的元素。splice有返回值,返回的是一个数组,包含的就是删除的那些元素。splice改变了原数组的内容。一般有以下四种用途。
(I)数组.splice(删除点的索引,要删除的元素数目,新元素1,新元素2,...新元素n):从数组某位置开始,删除指定数组的元素,并插入一些新元素。删除点的索引值可以是负值,表示数组从尾部倒数的位置。比如,索引值-3,指的是数组倒数第三个元素。
(II)数组.splice(删除点的索引,要删除的元素数目):删除数组中某位置之后几个元素。
(III)数组.splice(删除点索引):删除数组中某位置之后所有元素。
(IV)数组.splice(删除点索引,0,新元素1,新元素2...新元素n):在数组中某位置之后,插入新元素。
(11)获取数组中部分元素:slice。slice可以获取数组中一段连续的元素,而不改变原有数组的内容。它有两个参数:一个是截取范围的起点索引。另一个是截取范围的终点索引。slice的起点和终点索引值都可以是负值。返回值是截取的元素组成的新数组,而且不改变原有数组的内容,新数组中包括起始点索引的元素,而不包括终点索引的元素。
(I)数组.slice(起始索引,终点索引)。如果输入时,不慎将输入的起点索引设置为大于终点索引值,那么slice只会返回一个空数组。
(II)数组.slice(起始索引)。如果只传一个参数给slice,那么将把这个参数当成起始索引值,截取从这个索引值开始,到数组终点这一段元素,生成新数组。
(12)slice和splice的区别:
(I)slice不改变原有数组内容,splice改变
(II)slice根据指定起点和终点确定截取范围,splice根据指定起点和截取数量确定截取范围。
(13)将多个元素或数组拼和成新的数组:concat。
(I)concat可将多个元素或数组拼成一个新的数组,并通过返回值返回,不改变原有数组内容。
(II)数组.concat(参数1,参数2,参数3...参数n)
(14)concat和push比较
(I)concat相同之处:都是将参数中的元素按顺序加到数组的后面。
(II)concat和push不同点:
(i)concat不改变原有数组内容,而是生成一个新数组返回。push直接改变原有数组内容。
(ii)当参数是数组时,concat和push的行为不同。concat会将数组分开成各个元素按顺序加入,而push则把这个是数组的参数当成一个元素加入到原数组后面。
21.ActionScript3网络通信三个过程
答:ActionScript3把一个成功的网络通信抽象成以下过程:
(1)构建通信请求对象(URLRequest)
(2)使用通信请求对象,构建URLLoader对象,并发出数据请求。
(3)数据收到之后,发出完成事件,调用“读取完成”事件的侦听器处理返回的数据。
注:提交的数据放在URLRequest对象中,读取到的数据放在URLLoader队形中。
22.构建请求对象
答:要建立一个成功的通信请求,通信请求对象必须含有足够的信息,必须知道要向谁请求、通过什么方式、有没有要提交的数据。因此,这些信息包括:
(1)请求的URL地址:对应于URLRequest对象的url属性。
(2)请求的方式:对应于method属性,默认是GET方式。
注:(1)有两种方式可选GET和POST,使用URLRequestMethod.GET和URLRequestMethod.POST常量赋值。GET传送的数据量较小,不能大于2KB。POST传送的数据量较大,一般被默认不受限制。而且,两者传递参数时所用的编码不一定是一样的。
(2)有没有要提交的数据:数据对应于data属性,数据的格式对应于contentType属性。
(3)如果是纯粹的加载,那么不需要data属性。如果是要提交一部分数据,那么就要放在data属性中,比如XML文本等。
23.发出数据请求
发出数据请求,其实就是按照数据请求对象携带的信息,向指定地址发出请求。这部分由URLLoader对象来完成。
(1)直接将URLRequest对象传入URLLoader对象构造函数,这样URLLoader对象一建立,就可以立刻发送请求。
View Code
(2)可以先建立URLLoader对象,在合适的时候发送请求:
View Code
注:如果有数据返回,那么将会放在这个URLLoader对象的data属性中。可以通过URLLoader对象的dataFormat属性来判断data属性中存储的数据格式是三种哪一种?
(1)文本型(URLLoaderDataFormat.TEXT)
(2)二进制型(URLLoaderDataFormat.BINARY);
(3)变量名值对型(URLLoaderDataFormat.VARIABLES)
24.URLLoader对象会发出如下6种事件,可以让我们监听,并更好地控制加载流程:
(1)load()一调用,就发出Event.OPEN事件。
(2)加载过程中,发出ProgressEvent.PROGRESS事件,包含下载字节数信息。
(3)加载完成,发出Event.COMPLETE。
(4)加载完成或者失败之前,会发出HTTP状态事件HTTPStatusEvent.HTTP_STATUS
(5)记载失败,发出IOErrorEvent.IO_ERROR事件
(6)发出加载内容不合安全规则,发出SecurityErrorEvent.SECURIY_ERROR.
25.读取3种数据格式的例子
(1)服务器端的数据文件、服务器端脚本返回的数据、在本机执行时本机上的数据文件,都属于外部数据。
(2)URLLoader把读取到的外部数据划分为3中格式:文本、值对、二进制。其中,普通文本、XML等以普通UTF-8字符组成的字符串文本都属于文本格式。值对格式,就是一个URLVariables对象。二进制格式数据是最强大和灵活的一种数据格式,使用ByteArray对象表示。
(3)XML类型是文本格式数据的一种,URLLoader默认的数据格式就是文本,即dataFormat=URLLoaderDataFormat.TEXT。
(4)如果服务器端脚本是值对形式的数据,且是URL编码形式,那么就是URLVariables类型的数据。读取值对格式时,要注意设置dataFormat=URLLoaderDataFormat.VARIABLES。
(5)读取二进制格式数据后,二进制格式数据以ByteArray对象存储在URLLoader对象的data中。
26.监控加载进度
答:监控加载进度很简单,只需要增加一个侦听器,侦听URLLoader对象发出的ProgressEvent.PROGRESS事件。事件对象是flash.events.ProgressEvent类的实例,有两个属性:bytesLoader属性用来记录当前下载的字节数;bytesTotal 属性记录总共要下载的字节数。
27、打开网址
答:在ActionScript 3中使用函数navigateToURL()。使用navigateToURL()之前,必须导入flash.net包。API格式如下:
public function navigateToURL(request:URLRequest,window:String=null):void
request对象包含要跳转的网址,window字符串表示要显示request指定网址的浏览器窗口或者HTML框架(HTML frame)。如果不出入window参数,那么就是默认在新窗口打开。
window的常用字符串有4种:“_self”表示在当前框架当前窗口打开网址;“_blank”表示在新窗口中打开网址;“_parent”表示在当前框架的父框架上打开网址;“_top”表示在当前窗口的顶级框架中打开网址。
28.提交数据
答:如果只想提交数据,不需要读取返回数据,那么可以使用sendToURL()。使用格式如下:
public function sendToURL(request:URLRequest):void
但是,一般来说,向服务器端提交数据实际上总是包括两个步骤,提交数据和读取返回信息;
(1)提交的数据放入URLRequest对象的data属性中,使用URLLoader对象提交。
(2)读取服务端脚本返回的数据,这些数据存储在URLLoader的data属性中。
提交数据格式中,XML格式应用最为普遍。
29.沙箱模型
答:安全沙箱是一个虚拟的概念,代表着不同程度权限的环境。不同的安全沙箱(Sandbox),分配着不同来源资源的环境。资源主要包括数据、图形和各种文件。比如说,本机文件就在本地沙箱中,来自Internet的资源在远程沙箱中。
如何知道当前运行的SWF文件属于哪一个沙箱?使用只读属性Security.sandboxType即可。
SWF文件所使用的沙箱公有四种:
(1)Security.REMOTE:SWF文件来自Internet URL,并遵守基于域的沙箱规则。不能读取不同域中的资源,除非另有设置。
(2)Security.LOCAL_WITH_FILE:SWF文件是本地文件,可以读取本地数据,但无法与Internet进行通信。
(3)Security.LOCAL_WITH_NETWORK:SWF文件是本地文件,可与Internet通信,但不能读取本地数据。
(4)Security.LOCAL_TRUSETD:SWF文件是本地文件,且已使用“设置管理器”或Flash Player信任配置文件收到用户信任。此SWF文件既可以从本地数据源读取数据,也可以与Internet进行通信。权限最高。
安全沙箱有两条基本的原则:
(1)位于相同安全沙箱中的资源始终可以互相访问。
(2)远程沙箱中的SWF文件始终不能访问本地文件和数据。
任何 不符合安全沙箱的代码行为,都会导致抛出SecurityError异常。
30.跨域文件
答:跨域文件,即crossdomain.xml,一般放置在网站的根目录下。
当SWF文件试图向非本域的网址读取资源时,如发现该网址所在域没设跨域安全文件,或者跨域安全文件中并不包括SWF文件所在域,那么在运行时会发生安全异常。
31.授予脚本访问权限
答:跨域文件授予文件访问权限,Security.allowDomain()方法授予脚本访问权限。这个API授予的权限,主要包括下面几个部分:
(1)SWF文件之间的跨脚本访问。
(2)显示列表访问
(3)事件检测
(4)对Stage对象的属性和方法的完全访问
当在一个父SWF文件加载本域的子SWF文件时,双方没有脚本访问限制:子SWF文件可以调用父SWF文件的脚本;父SWF文件也可以访问子SWF文件脚本。
但如果加载其他域的SWF时,就会遇到安全限制。这时,就需要使用代码授予制定来源的SWF文件以访问权限。
32.显示对象
答:(1)从ActionScript3的角度来看,不管多复杂的视觉图像都是由显示对象和显示对象容器组合而成。
(2)同一的视觉等级结构中,包含两大类型的显示对象:一种是可以包括其他显示对象的显示对象容器,简称容器;另一种是单纯的显示对象,除自身以外不能包括其他显示对象,简称为非容器对象。
(3)只有容器才拥有管理子对象的方法,非容器对象没有管理子对象的方法。
(4)舞台是最根本的容器,包含着当前SWF所有的显示对象。舞台又是一种特殊的容器,每个Flah应用程序只能有一个舞台容器。舞台也是整个对象树结构的根节点。
33.显示对象种类划分
答:ActionScript3显示对象种类划分:一个统一、两个层次
(1)一个统一是指,所有的显示对象都统一于DisplayObject类。所有的显示对象(包括容器)都是其子类的实例。
(2)第一大层次:可以接受互动事件称为可互动的显示对象,不可接受的互动事件称为不可互动显示对象。(所谓接受互动事件,是指能够接受鼠标单击、键盘敲击等人机交互事件)。
(3)第二大层次:可以容纳其他显示对象的称为显示对象容器,不可容纳其他显示对象的称为非容器显示对象。
34.显示对象类库架构
答:(1)所有显示对象都是继承自父类DisplayObjectde。父类DisplayObject继承自EventDispatcher类。这意味着,ActionScript3中所有的显示对象天生就可以发送事件。
(2)类图的核心是3个抽象类:DisplayObject、InteractiveObject、DisplayObjectContainer。
35.显示对象
答:(1)显示对象类(DisplayObject)是所有显示对象的抽象父类,归集了一些明显对象共有的特性。它的构造函数不能被调用,从而不可以被实例化。我们只能实例化它的子类,操作它子类对象。我们不能直接创建继承自DisplayObject类的子类,而是只能继承自DisplayObject具体子类。
(2)"显示对象.mouseX"和“显示对象.nouseY”得到当前鼠标指针离这个显示对象注册点的横向距离和纵向距离。
36.矢量图(Shape)
答:(1)Shape类专门用来绘制简单的矢量图。
(2)Shape直接继承自DisplayObject,并不是容器,它与父类的区别就在于多了一个graphics的实例属性。
(3)Graphics对象绘制方法的分类:
(I)填色:
(i)单一颜色填充:beginFill(color:uint,alpha:Number=1.0):void
(ii)渐变填充:beginGradientFill
(iii)使用位图填充:beginBitmapFill
(II)画线:
(i)绘制曲线:curveTo
(ii)绘制直线:lineTo
(III)绘制基本图形
(i)绘制圆形:drawCircle
(ii)绘制椭圆:drawEllipse
(iii)绘制矩形:drawRect
(iv)绘制圆角矩形:drawRoundRect
(IV)线头样式:
(i)线条样式:lineStyle
(ii)渐变线条样式:lineGradientStyle
(V)清除图形:清除绘制到此Graphics对象的图形,并重置填充和线条样式设置。clear();
(VI)移动当前绘制点位置:moveTo(x:Number,y:Number):void
37.位图(Bitmap)
答:一般来说,矢量图体积小,但比较消耗计算资源,而位图则比较消耗内存资源,但对计算资源消耗小。
38.遮罩(mask)
答:(1)如果想给可视对象B设置一个遮罩,将显示对象A用于遮罩。DisplayObjectB.mask=displayObjectA;如果不想再使用遮罩了,那么将mask设置为null即可:DisplayObjectB.mask=null;
(2)如果将遮罩显示对象和被遮罩的显示对象都使用位图缓存,则可以使用Alpha通道遮罩。
39.捕获HTML文本超链接的信息
答:HTML中的超链接必须以“event:”开头,将超链接要发送的信息防止在它的后面,以字符串的形式表现。这样,当用户单击超链接时,会发出一个事件,是flash.events.TextEvent类的实例,事件类型是TextEvent.LINK。“event:“后面的字符串信息会包括在这个事件对象的text属性中,供监听器使用。
40.碰撞检测
答:在ActionScript3中,只要是显示对象都可以使用如下两种方法来检测碰撞。
(1)hitTestObject(obj:DisplayObject):Boolean,检测是否与某个显示对象(obj)碰撞。
(2)hitTestPoint(x:Number,y:Number,shapeFlag:Boolean=false):Boolean,检测是否和某个舞台坐标点发生碰撞。其中shapeFlag定义的是检查显示对象的实际像素(true),还是检查显示对象的边框(false)。
41.Flash程序中所有对象的添加流程
答:(1)首先,当一个Flash程序运行时,不论是在独立播放器中,还是嵌套在网页里,最先自动生成的是stage容器对象。stage容器对象是显示列表中的第一个显示对象容器。每个Flash程序只能有一个stage容器。显示列表从Stage开始。
(2)其次,当第一个SWF文件被载入后,会自动成为Stage容器的一个子显示对象。
(3)然后,SWF文件主要对象中创建的显示对象,才会按照它们加入显示列表的代码顺序,逐一被显示出来。
(4)如果一个容器没有加入显示列表,那么它里面的所有显示对象也不会加入到显示列表中,从而不会被显示。
42.Animator提供的所有控制动画播放的方法和属性:
答:方法:
(1)end():void 停止播放动画,Flash Player会立即转到动画序列中的最后一帧。
(2)nextFrame():void 使Flash Player前进到动画序列中的下一帧。
(3)pause():void 暂停动画,直到调用resume()方法
(4)play():void 开始播放动画
(5)resume():void 在动画由pause()方法暂停后继续播放动画。
(6)rewind():void 将Flash Player设置到动画的第一帧。
(7)stop():void 停止播放动画,Flash Player将返回到动画序列中的第一帧
属性:
(1)autoRewind:Boolean=false 将动画设置为完成后重新开始播放
(2)isPlaying:Boolean[read-only] 指示动画当前是否正在播放。
(3)target:DisplayObject 正呈现动画效果的显示对象
(4)time:int 从零开始,指示和控制当前动画中的时间。
43.排序
答:(1)数组.reverse()。reverse方法是对数组元素倒序,返回值是新的数组。
(2)sort方法是对数组元素元素排序。有3种使用方式。
(I)数组.sort();//默认排序。默认排序时按照字符串字母顺序排序的,返回值是排序后的数组。
(II)数组.sort(排序方式);//使用“排序方式”参数来排序,排序方式是一些定义好的整数常量
(III)数组.sort(比较函数);//使用自定义的比较函数,注意此处只写函数名即可
(3)当数组元素是复杂数据类型,且需要根据这种对象的某个属性值来排序时,就需要用到sortOn方法。
例如:某数组元素都有一个属性值name,希望根据name来排序,那么使用方法如下:
(I)数组.sortOn("name");//根据指定属性,默认排序
(II)数组.sortOn("name",排序方式);//根据指定属性,使用指定的“排序方式”来排序
(III)数组.sortOn("name",比较函数);//根据指定属性,使用自定义函数排序
(4)排序方式:所谓排序方式,实际上是一些在Array类中定义好的整形常量,代表几种不同的排序方式。排序方式可以同时用多个,使用“|”号隔开。一共有5种:
(I)Array.CASEINSENSITIVE 值为:1,表示大小写不敏感按字母顺序排序,如果是数字则从小到大。
(II)Array.DESCENDING值为:2,表示按字母倒序排列
(III)Array.UNIQUESORT值为:4,表示必须是唯一性排序,如果比较值结果相同,则放弃排序
(IV)Array.RETURNINDEXEDARRAY:值为8,让sort()和sortOn()函数返回值返回排序后的索引列表,同时保持原数组不变。
(V)Array.NUMERIC or 16 值为16,强制sort()和sortOn()中对数值采用从小到大排序,否则,不设方式,sort()和sortOn()将把数字当成字符串来排序
44.操作数组每个元素的方法
答:
(1)遍历操作 forEach(callback:Function,thisObject:*=null):void 操作数组中每一项元素。回调函数不需要返回任何值。
(2)过滤器 filter(callback:Function,thisObject:*=null):Array 将符合回调函数条件的元素提出来,构成一个新的数组并返回。回调函数返回单个新数组元素。
(3)映射器 map(callback:Function,thisObject:*=null):Array 根据回调函数操作原数组每个元素,并利用回调函数返回结果生成新的数组。回调函数返回单个新数组元素。
(4)有一个满足则为真 some(callback:Function,thisObject:*=null):Boolean 只要有一个元素能让回调函数返回true,则some()返回true,否则为false。回调函数返回单个元素比较结果,布尔值。
(5)全员满足才为真 every(callback:Function,thisObject:*=null):Boolean 必须所有元素都让回调函数返回true,every()才返回true,否则为false。回调函数返回单个比较结果,布尔值。
45.ActionScript3中提供了3种函数可以方便地操作String中的每一个字符
答:(1)使用charAt()访问目标位置的字符。
(2)使用charCodeAt()得到目标位置字符的Unicode字符的整数字符代码。
(3)使用fromCharCode()从指定的Unicode值得到相应的字符串。
46.几种字符串操作
答:(1)indexOf()方法是用来判断一个字符串是否存在于一个更长的字符串中。从长字符串左端到右端来搜索,如果存在该字符串就返回它所处的位置(即索引)。如果在被索引的字符串中没有查找的字符串就返回-1。lastIndexOf(),从长字符串的右端搜索。很多的时候用indexOf()不是为了真的想知道字符串的位置,而是想知道长字符串中有没有包含这个子字符串。如果返回索引值是-1,那么说明没有;不等于-1,那么就是有。
(2)substring()、slice()和substr()的使用及区别
(I)三者都是从长的字符串中提出的子字符串。三者相同之处在于,都不会改变原来长字符串的内容,只是返回符合条件的子字符串。
(II)用法:
(i)substring:长字符串变量.substring(起始位置,终点位置)
(ii)slice:长字符串变量.slice(起始位置,终点位置)
(iii)substr:长字符串变量.substr(起始位置,要截取的字符串长度)
(3)split()可以将字符串按指定的分隔符分开。
47.使用的mx.utils.StringUtil工具类,它提供了4中静态方法:
答:(1)截断字符串首尾空白:StringUtil.trim(str:String):void
(2)替换字符串:StringUtil.substitute(str:String,...rest):String
(3)trim分割符分割的字符串:StringUtil.trimArrayElements(value:String,delimiter:String):String
(4)检测空白符:StringUtil.isWhitespace(character:String):Boolean
48.DOM3事件的执行流程
答:DOM3事件机制包含着4个步骤:注册侦听器、发送事件、侦听事件、移除侦听器。
49.Event类的属性
答:Event类的公开的实例属性只有6个:type、target、currentTarget、eventPhase、bubbles和cancelable。这些事例属性全都是只读属性。
(1)type用来存储事件对象的名称,是字符串类型。
(2)target是Object类型,持有引用、指向最初发出事件的那个对象。
(3)currentTarget、eventPhase和bubbles这3个属性都和事件流机制相关。
(4)cancelable属性是一个布尔值,表示这个事件引起的默认动作是否可以被取消。
50.Event对象拥有7种实例方法
(1)使用clone()方法可以返回当前事件对象的一个拷贝。
(2)toString()返回对象表示的值的字符串形式。
(3)stopImmediatePropagation()、stopPropagation()用来阻止事件的传播,从而使侦听器失去效用。
51.自定义类发送事件的3种方式
答:有3种方式可以发送事件:
(1)继承EventDispatcher:让自定义类类直接继承EventDispatcher,就可以进行事件发送了,这是最方便、最快的一种方式。
(2)复合EventDispatcher对象:只有不需要把这个类的实例看成是EventDispatcher或IEventDispatcher类型时,才能考虑使用这种复合EventDispatcher对象的方式发送事件。
(3)实现IEventDispatcher接口。
52.异常
答:(1)由于ActionScript3没有对线程的支持,所以异常分为两种:同步异常和异步异常。Error和其子类一般用来处理同步时的程序异常。在异常处理时,所产生的异常用相关的异常事件(ErrorEvent)表示。这两种异常的本质和处理机制都不同:对于同步异常来说,使用try-catch来处理;对于异步异常,采用的是事件侦听机制来处理。而且,异常事件并不是Error的子类,而是flash.events.ErrorEvent的子类。
53.对异常事件处理
答:异常事件有两类
(1)扩展ErrorEvent类的异常事件
(2)基于状态的异常事件
异常事件处理分为以下两步
(1)添加侦听器,负责侦听可能 发出的异常事件,与添加try作用类似
(2)编写侦听器函数,里面放置处理异常事件的代码,与catch作用类似
54.用API实现的一些常用XML操作
答:(1)appendChild(child:Object):XML:在当前子元素列表之后添加
(2)prependChild(value:Object)XML:在当前子元素列表之前添加
(3)insertChildAfter(child1:Object,child2:Object):*在子元素child1之后添加
(4)insertChildBefore(child1:Object,child2:Object):*:在子元素child1之前添加
(5)contains()对比该XML对象与给定value参数
(6)elements()列出某XML对象的元素
55.正则表达式与字符串的结合使用
答:正则表达式与字符串结合使用的方式有两类:使用RegExp类的两个方法,即exec()和test();或使用String类的方法,在字符串中匹配正则表达式match()、replace()、search()和splice()。
(1)RegExp类的test()方法只检查提供的目标字符串是否包含正则表达式的匹配内容。如果包含,返回true;不包含,则返回false。
(2)RegExp类的exec()方法也可以来检查提供的字符串是否有正则表达式的匹配,不过它返回的是一个数组,内容包括匹配的子字符串、同正则表达式中的任意括号组匹配的子字符串。这个数组还有index属性,指明子字符串匹配起始的索引位置。
(3)String类的search()方法返回与给定模式相匹配的第一个子字符串的索引位置。match()搜索匹配的子字符串,找到了就返回匹配的子字符串。如果在正则表达式模式中使用了全局标志g,match()将返回一个包含匹配子字符串的数组。
(4)String类的replace()需要两个参数,第一个参数是传入的正则表达式,第二个是要替换的字符串。如果正则表达式没有设置g标志符,那么只替换一个;如果设置了g标识符,将替换多个。