ActionScript 3.0 详解(一)
来源:互联网 发布:来凤餐饮数据分析 编辑:程序博客网 时间:2024/04/30 14:56
ActionScript 3.0 详解(一)
**注意:ActionScript和Java的一般东西都是相通的,这里我们只介绍不同于Java的部分,没有提到的可以按照Java语法和规则分析。
**注意:在MXML文件的<mx:Script>中一般都是定义ActionScript的方法;在ActionScript的as文件中一般都是定义类(class)----类似Java中的内容!
1.变量的定义:一律使用"var"关键字进行声明,不过不同与JavaScript的地方就是这里一定要指明变量类型名(向Java看齐),
*格式: var 变量名:类型名 = new 类型名(); *类比Java中定义方式: private String str = new String();
例如: var str : Array = new Array(); //定义一个数组类型的变量,变量名为str
2.函数(方法)的定义:一律使用"function"关键字开头,不过一定要指定方法的返回类型!!(向Java看齐)
*格式: function 方法名(参数列表) : 返回类型 {方法体;} *类比Java中定义方式: public [static] void init(){}
例如: internal function init() : void {
var str : Array = new Array();
//for循环和Java一样,只不过定义变量i的时候要注意一下
for(var i : Number = 0; i<5; i++){
//为数组元素赋值,且数组长度将会是5个元素
str.push("元素" + i);
}
}
说明: internal关键字是作用域修饰符,表示这个方法在包作用域级别的范围内可以被调用。
*在Flex的MXML中的<mx:Script>中可以直接定义ActionScript中的方法,以供调用!
3.控制台打印方法: ActionScript中使用"trace(被打印的变量)"方法(它也会自动调用toString()方法),
该方法将会在控制台打印(类似Java中的System.out.println()方法)。
*注意:该方法只会对程序调试的时候才会有效,同时也要求客户端安装Flash Player 9的调试版本,
只有这样才能正常的进行调试,也即只有这样trace()方法才会正常在控制台打印数据。
4.循环for...in的使用:
例如
var student : Student = new Student();
for(var prop : String in student){
//prop对应的是student的属性名,而student[prop]就是得到student对象中对应的prop属性值
trace(prop + ":" + student[prop]);
}
5.循环for each的使用:
例如
for each(var value : * in student){
//value就是依次循环到的student的属性值
trace(value);
}
说明: 变量类型名指定的"*"表示可以是任何类型(当然这里的*不是必须的,可以指定具体的类型名),
也就是说student的属性值可以是任何类型的值,value就是用来接收student的属性值的变量。
6.方法中参数的定义方法: 仍然使用 "变量名:类型名" 的形式,如 function init(one : int, two : String) : void {方法体;}
7.with语句的使用: 就是平时我们都要使用"对象.属性或方法"来调用属性或方法,如果将对象放入with()上,那么with块中调用该对象的属性或方法时就不需要再加上对象名了。
例如 :有student.name和student.age属性和student.init()方法
with(student){
name = "lijie";
age = 22;
init();
}
8.类(class)的定义: ActionScript是面向对象的,所以也有package、class、访问控制符、abstract、extends、interface和static等机制。
ActionScript中的最终父类和Java一样,也是Object类!
*区别: ActionScript中的一个类中不能定义多个构造函数,即不支持构造函数的重载(Overload)!
*区别Java的地方: 在ActionScript中包定义后用"{}"括起来,而不是像Java一样用";"分号结尾!!
例如:
//指定类所在包,包结尾用大括号"{}"结束
package com.lj {
//如果类中使用到了其他的类,那么同样也要import进行导入,用分号";"结尾
//import com.lj.Xxx;
//定义类名(和Java中一样,默认也会继承Object类)
public class MyClass{
//定义一个变量
private var name : String;
//构造函数没有返回值(和Java中一样)
public function MyClass(name : String){
//为变量赋值
this.name = name;
}
}
}
**注意:类定义好之后怎么使用呢?
---- 我们可以在MXML中的<mx:Script>中调用这个类,实例化对象并且调用属性或方法来进行测试。
不过使用之前要使用"import"关键字将类引用进来,然后才可以使用。(可以认为<mx:Script>就是Java中的main方法,即程序的入口)
9.访问控制符: public 、 protected 、 private 和 internal(相当于Java中默认的访问控制符,表示包内可以访问)。
10.常量的定义方式: 使用"const"关键字来定义,不像Java中提供了"final"关键字!
例如: public const PI : Number = 3.1415926; //变量PI为一个常量
11.静态"static"的用法和Java中的用法完全一样!!
12.继承和接口:完全类似Java语言,继承(extends)中也是单继承;接口中也是定义方法的声明,接口可以多实现(implements)。
*注意:接口中声明方法或变量的时候不能加访问控制符!!
例如: public interface My{
//方法的声明,直接写方法声明,不用加访问修饰符
function init(name : String) : void;
}
13.数组: ActionScript中的数组Array也是一个类,里边有很多好用的API方法,使用时可以参看API文档!
例子:
var arr : Array = new Array();
//向数组中保存数据
arr.push({name:"lijie", age:21}); // 这里向数组中保存的元素为一个对象(类似JavaScript中的原对象,ActionScript中也可以这样使用)
14.字符串String : 使用时参看API文档。
15.强制类型转换: 不同与Java中的语法,ActionScript 中强制类型转换是 "类型名(被转换的变量)"。
例如:
var age:int = 24;
var name:String = String(age); //把age变量强制转换成String类型
类比Java :
private int age = 24;
private String name = (String)age; //强制转换成String类型
*注意: Boolean类型的强制类型转换,false转成0,true转成1
16.强制类型转换2 : 使用"as"关键字进行转换。
例如:
var age : int = 19;
//将age变量强制转换成Number类型的对象。
//如果转换成功则把转换后的对象返回;如果失败则返回Null
var number : Number = age as Number;
17.异常处理机制: try ... catch ... finally ... : 其中ActionScript的异常总父类为Error类,不同于Java中是Exception类(继承Throwable类)。
*注意: catch(error : Error){ ... } //注意catch中的参数的写法!!
18.特殊方法和关键字的使用: typeof() 和 is ,其中 "typeof(变量)" 可以返回"变量"所属的类型名,但是这种方法判断的不是很准确;
可以使用"is"关键字(运算符)来进行精确的判断,如 "变量名 is 类型名" 直接判断,是则true,不是则返回false
*注意: Java中有 "instanceof" 判断关键字!!
19. ActionScript中有很多类,可以自己参看API文档学习!
20.事件机制 : 基本和Java完全一样,不过有一点儿区别。
*区别: 当制造一个事件之后,ActionScript将会有一个事件流机制,这个事件流流经的注册该事件监听的组件的监听方法都会被触发(调用),
因为事件流是一个往复过程,对每个流经的对象都会有两次流过(流入、流出),其中ActionScript默认机制关闭了流入触发的功能,
所以只有流出组件过程经过的组件的事件才会被触发,即便默认不关闭流入触发,每个组件的事件也是只能触发一次(2选1)。
*注意: 所谓的事件流只对有嵌套关系的组件影响明显,如果是对单一的一个组件制造事件,那么当然就只触发这个组件的监听方法;
如果是有嵌套关系的组件,那么就会有事件流的区别了!比如建立一个如下的嵌套关系模型:
<mx:Canvas id="cas1">
<mx:Canvas id="cas2">
<mx:Button id="bnt"/>
</mx:Canvas>
</mx:Canvas>
*机制概念: 事件流有三个阶段,捕获阶段、目标阶段、冒泡阶段!
** 捕获阶段: 就是产生事件后,从根节点到子节点(不包括目标对象),依次检查对象是否注册了对应事件的监听器,
如果注册了就调用触发监听事件的方法。(默认该阶段的监听是关闭的)
** 目标阶段: 所谓目标就是事件源,即事件在哪个组件上产生。该阶段是调用目标对象本身注册的对应的监听器方法。
如果为目标对象注册监听器的时候开启了捕获阶段的监听,那么将不会对目标阶段和冒泡阶段监听,
那样目标对象的监听方法将不会被执行,因为捕获阶段不包括监听目标对象。
** 冒泡阶段: 从目标节点到根结点,依次检查对象是否注册了对应的事件监听器,如果注册了就调用监听方法。
*** 注意: 事件发生后,每个节点可以有两个机会(2选1)响应事件,ActionScript 默认关闭了"捕获阶段",
就是默认从节点到子节点不会调用经过的组件的事件方法,只会调用目标阶段和冒泡阶段的事件方法。
还要注意的是只有"目标阶段"才会让目标对象触发事件方法,其他两个阶段都不能,
其他两个阶段都是从根流到目标和从目标流到根,触发的都是根到目标之前的组件的事件,不包括目标对象的事件。
*例如: 上边的模型,进行注册监听器和事件方法。
*注意: 同一个事件可以注册多个不同的事件方法!!
addEventListener方法有优先级的设定,即执行的先后顺序!!
<mx:Script>
<![CDATA[
import mx.controls.Alert;
//该方法让应用启动时调用
internal function init():void{
//注册监听器鼠标点击事件
cas1.addEventListener(MouseEvent.CLICK,onPress); == cas1.addEventListener("click",onPress);
cas2.addEventListener(MouseEvent.CLICK,onPress);
bnt.addEventListener(MouseEvent.CLICK,onPress);
}
//监听器方法
internal function onPress(evt : MouseEvent):void{
Alert.show("目标对象: " + evt.target + "是否冒泡: "+evt.bubbles + "所处阶段: "+evt.eventPhase + "当前对象: "+evt.currentTarget);
}
**注意: 事件监听方法的参数必须指定一个"事件类型",可以自己确定选择那种事件类型作为参数。
]]>
</mx:Script>
说明: 可以调用removeEventListener()方法来移除事件。
如果调用evt.stopImmediatePropagation()方法,那么将会只触发这一个监听器方法,之后事件流流过的组件的监听器方法不会再被触发。
可以参看Event事件的API接口。
21.Event类:该类是事件类的基类,当发生事件时,Event对象将作为参数传递给事件监听器方法,以便对事件对象进行个性化操作。
比如说Event类的子类有MouseEvent、KeyboardEvent等事件类,这些都可以适我们事件的类型作为事件监听方法的参数。
22.自定义事件类型: 有两种方式。
A.使用dispatchEvent()方法向调用该方法的组件对象的事件流中添加一个事件,也就是说为调用方法的对象制造一个新的事件,
因为事件监听器一直监听事件流中是否有对应的事件,如果有则会触发对应的监听方法。如果通过该方法手动的向组件对象的事件流中添加一个新事件,
那么如果组件对象正好有注册了这个事件的监听器,那么就会立即触发监听器方法。
例子:
<mx:Script>
<![CDATA[
//启动项目时自动运行
internal function init():void{
//创建一个按钮
var bnt1 : Button = new Button();
var bnt2 : Button = new Button();
//注册一个"testEvent"事件监听器,监听方法为onShow()
bnt1.addEventListener("testEvent",onShow);
//为按钮2注册click事件
bnt2.addEventListener("click",onClick);
}
//按钮2的监听器方法
internal function onClick(evt : MouseEvent):void{
//动态的向按钮1的原事件流中添加一个新的"testEvent"类型的事件,
//添加完后如果按钮1注册有testEvent类型的监听器,那么会立即触发调用监听器方法,即触发onShow方法。
bnt1.dispatchEvent(new Event("testEvent",true,false));
//注意:dispatchEvent方法是为调用该方法的组件对象的事件流中添加(制造)事件!!
}
//按钮1的监听器方法,这里的参数是Event类型,就是说所有的类型的事件都可以接收
internal function onShow(evt : Event):void{...方法体...;}
]]>
</mx:Script>
**说明:当点击bnt2的时候,会触发调用onClick方法,
方法中会手动为bnt1制造一个类型为testEvent的事件(即向bnt1原事件流中加入新的testEvent类型的事件),
由于bnt1正好有一个监听testEvent类型的监听方法,所以监听器会马上侦测到新事件的生成,所以会触发调用onShow方法来响应。
*注意:当有嵌套关系的组件存在时,注意是哪个组件调用的dispatchEvent方法,会有一定区别。
当子节点调用时,那么如果父节点注册有该事件类型的监听器,也会被触发,因为dispatchEvent把事件加入到子节点的事件流中,
而子节点事件流有冒泡功能的话会流向根节点的,和上边将的一个意思。
当根节点调用时,也是上面的方式进行分析即可!!
B.上边那种自定义事件就是通过代码手动制造的一个事件,
而不能像用点击鼠标或键盘等外部设备来制造事件进而触发事件(由于ActionScript为我们提供的使用外部设备制造事件的类非常齐全,
所以不用我们自己再定义这种类型的事件类)。上边我们使用的都是new Event()对象,
只能使用ActionScript提供的那种构造方法而不能加入我们自己想要携带的一些属性值等。
*解决方案:可以定义自己的事件类,来继承Event类,然后通过new创建我们自己的事件类即可。
例如:
public class NewEvent extends Event{
//定义常量变量,用来保存事件类型字符串
public static const NEWCLICK : String = "newevent";
//添加自定义属性,用来携带自己想要使用的数据信息
public var data:String;
public function Event(type:String, data:String){
this.data = data;
//调用父类构造方法
super(type,false,false);
}
}
*说明: 然后就可以将A方式中的代码中的bnt1.addEventListener("testEvent",onShow);
改成bnt1.addEventListener(NewEvent.NEWCLICK,onShow);和bnt1.dispatchEvent(new Event("testEvent",true,false));
改成bnt1.dispatchEvent(new NewEvent(NewEvent.NEWCLLICK,"China"));
*优点: 携带了自己要使用的data属性值"China"
23.垃圾收集器: ActionScript也有自己的垃圾回收机制,和Java的功能差不多,可以认为是一样的功能。
24.弹出窗口: 可以使用Alert类的相应方法(如show()方法)来以弹出窗口的形式显示内容!!
25.使用MXML来实现事件处理机制:见另一个笔记(Flex笔记)的第7个标题。
26.ActionScript中属性的getter和setter方法和Java中的有一点区别,就是get和set关键字后边加一个空格符。
例如
private var age:int;
//getter方法
public function get Age():int{return age;} ==== Java中对应的方法:public int getAge(){return age;}
//setter方法
public function set Age(age:int):void{this.age = age;} ==== Java中对应的方法:public void setAge(int age){this.age = age;}
注意: 文中提到的《Flex3 Component Explorer》文档可以到本人的下载空间下载!
- ActionScript 3.0 详解(一)
- Actionscript 3.0 笔记一
- ActionScript 3.0 详解(二)
- ActionScript 3.0 基础(一)
- ActionScript 3.0 学习笔记一
- Actionscript 3.0 事件机制剖析(一)
- ActionScript 3.0 详解(三)—完
- ActionScript 3.0
- ActionScript学习一
- ActionScript运算符详解
- ActionScript影片属性详解
- ActionScript自定义对象详解
- ActionScript数组对象详解
- ActionScript时间对象详解
- ActionScript声音对象详解
- actionscript 打开URL详解
- ActionScript语法详解
- Actionscript 3.0 事件机制剖析---事件发送方式(一)
- 常用知识
- 调试和测试 Swing 代码
- x200 vistar系统硬盘安装ubuntu9.10
- 记忆和幸福交错
- android 实现gif播放
- ActionScript 3.0 详解(一)
- coords
- Silverlight中的拖拽实现的图片上传---1
- [转]吐血推荐250部必看电影下载 IMDB TOP 250 download
- EOF结束符
- 职场英语四--呈报
- ActionScript 3.0 详解(二)
- ActionScript 3.0 详解(三)—完
- windows API编程之二----控制台模拟Win32程序