2008/07/10 | 暑期 AS3 脚本编程系列讲座教案二 侦听
类别(Flash学习笔记) | 评论(0) | 阅读(249) | 发表于 00:26

今天讨论侦听结构和侦听器的代码、事件。

侦听的步骤:

1、用户( Listener ) 将 自己 添加到 事件源 的用户名单(目录)中去。 用户.addEventListener( 事件源.事件, 处理函数 );  

2、当事件发生时,事件源将消息发送给订阅了该事件的用户。(通过查找用户名单,通知每一个名单上的用户)

3、系统按照事先的“约定”,执行相关的函数。

特点:

事件源 可以同时向多个用户发送消息,或者说被多个用户观注(侦听)。(所以是侦听对象?)

用户 可以同一时间接收不同的消息,或者说侦听不同的事件,所以将消息的用户也称侦听器。

用户与用户之间没有必然的关系,接收同一消息的前后次序由系统决定,基本上是同时收到消息。

具体到一个对象,有可能既是 某些消息的发出者(事件源),又是某些事件的接收者(侦听器)。

关于鼠标事件:

当显示对象中具有实际的内容时,它才能感受(侦听)到(它自己的)鼠标相关的事件。

当鼠标在 显示对象中完整的进行了一次按下、抬起之后,才会触发 Click 事件。

在对象的外面按下,里面抬起时,只触发 MouseUp 事件。

在对象的里面按下,外部抬起,只触发 MouseDown 事件。(也就是说 有效的按下 和 有效的抬起 并不总是同时出现)

Click  事件总是在 MouseUp 事件之后才发生的。

如果希望在全屏中实现随意画线,那么应该通过 stage 属性去侦听发生在舞台上的鼠标事件。

stage 是显示对象的一个属性,通过它可以访问舞台的相关属性内容。

例一: 下面的类当做是文档类时,可以在舞台的所有位置进行画线,因为它是对舞台上的鼠标事件进行的侦听。

package {
  import flash.display.Sprite;
  import flash.events.MouseEvent;
  public class StageDraw extends Sprite {
   
    // Flag to indicate whether the mouse is in draw mode
    private var _drawing:Boolean;
   
    public function StageDraw(  ) {
      // Configure the line style
      graphics.lineStyle( 2, 0xFFCC33 );
     
      // Drawing is false until the user presses the mouse
      _drawing = false;
     
      // Add the mouse listeners on the stage object to be
      // notfied of any mouse event that happens while the
      // mouse is over the entire movie
      stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing );
      stage.addEventListener( MouseEvent.MOUSE_MOVE, draw );
      stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawing );
    }
   
    public function startDrawing( event:MouseEvent ):void {
      // Move to the current mouse position to be ready for drawing
      graphics.moveTo( mouseX, mouseY );
      _drawing = true;
    }
   
    public function draw( event:MouseEvent ):void {
      if ( _drawing ) {
        // Draw a line from the last mouse position to the
        // current one
        graphics.lineTo( mouseX, mouseY ); 
      }
    }
   
    public function stopDrawing( event:MouseEvent ):void {
      _drawing = false;
    }
   
  }
}
例二:下面的代码,与库中的元件进行链接后,在元件的可显示区域内,可进行画线,因为,这里侦听的是可显示元件上发生的鼠标事件,只有当元件中的实质内容时,才会触发鼠标的相关事件。

package
{
 import flash.display.MovieClip;
 import flash.events.Event ;
 import flash.events.MouseEvent;
 
 public class DrawLine extends MovieClip  
 {
  private var mc:MovieClip ;  
  public function DrawLine()
  {
   mc = new MovieClip();
   addChild( mc );  
   addEventListener(MouseEvent.MOUSE_DOWN, onMD);    
  }   
  public function onMD(evt)
  {
   trace( "mouse down");
   mc.graphics.lineStyle(3, 0xffffff, 1);
   mc.graphics.moveTo( mouseX, mouseY);
   addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
   addEventListener(MouseEvent.MOUSE_UP, onMU ); 
  }
  public function onMouseMove( Evt:MouseEvent  )
  {   
   mc.graphics.lineTo(mc.mouseX, mc.mouseY );   
   //trace( mouseX,mouseY );
  }
  public function onMU(evt)
  {
   trace( "mouse up");trace( "clicked ");   
   removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
   removeEventListener(MouseEvent.MOUSE_UP, onMU );    
  }
 } 
}

事件处理函数需要指定一个参数,该参数为 Event 类型,通过 target 属性和currentTarget 属性,可以访问到发生事件的直接对象,代码形式为  evt.target      evt.currentTarget 。

示例三: 分听侦听舞台事件 和 元件中的事件,可以发现两者的作用范围不同。

package
{
 import flash.display.Sprite;
 import flash.events.MouseEvent;
  
 public class  Listener extends Sprite
 {
  function Listener()
  {
   //侦听舞台上发生的鼠标点击,全部屏幕范围均有效
   stage.addEventListener( MouseEvent.MOUSE_DOWN, onMD );
   
   //侦听发生在元件有效范围上的点击,只有在元件的实质内容上才发生。
   addEventListener( MouseEvent.MOUSE_DOWN, onMouseDown);
  }
  private function onMD (evt)
  {
   trace( "mouse down on the stage" );
  }
  public function onMouseDown(evt)
  {
   trace( "mouse down on the sprite" );
  }
 }
 
}

1

评论Comments