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》文档可以到本人的下载空间下载!

原创粉丝点击