返回“Flash基础理论课 - 目录”
我们最初的目标就是要制作出流畅的交互动画,多数都是通过鼠标进行交互的。在第二章里面曾介绍过鼠标事件,但没有涉及到具体的应用。
本章将踏出交互动画的第一步。我们将学会如何处理拖拽,抛落及投掷。但首先要从基本的鼠标按下与释放说起。
按下及释放影片
鼠标可真是件了不起的发明,虽说只是个简单的设备。实际上鼠标只负责两件事:检测移动及点击按钮。计算机用获得的这些信息可以做很多事:通过获知鼠标指针的位置,确定当发生点击的位置,移动的速度,及确定双击事件的发生。当我们从事件的角度来看这些问题时,可以归结为点击与移动(当然,现在的鼠标还配有滚轮,跟踪球或是比一台廉价手机还多的按钮,但现在我们考虑最基本的鼠标种类)。
一次点击事件可分为两部分:鼠标键按下时的事件及鼠标弹上来的事件。通常情况下,这两个事件是在一瞬间发生的。有些时候,这两个事件会被时间和移动分隔开,通常解释为拖拽——按下,移动,最后释放。本章就围绕下面三件事展开:鼠标按下,鼠标弹起,以及发生在它们中间的移动。
对于鼠标事件的处理,在AS 3中确实发生了很大的变化,所以需要全面地重新学习一下这些基础问题,拥有坚实的基础是非常重要的。AS 3事件体系的结构非常合理也非常科学,而早先版本的AS 有时看起来就像巫术一样。
鼠标事件只能由 Sprite 影片,影片剪辑或其它交互对象在鼠标经过它们的图形时产生。在AS 2中,这些也许只对某些鼠标事件起作用,而对其它的却不起作用,这就显得非常混乱。同时也使如 onRelase和onReleaseOutside 这样的复合事件成为必需品。
另一个本质上的改变是在嵌套对象与鼠标事件之间的。在AS 2中,没有办法使用影片剪辑内部的影片来侦听事件。外层的影片剪辑可以捕获所有的鼠标事件,而后事件就不再向下流通。而在AS 3中,就没有这些限制,使用影片剪辑或 Sprite 影片或嵌套影片进行侦听都没有问题。
需要注意的是主要影片事件是 mouseDown, mouseUp,和mouseMove。它们都被制作成了MouseEvent 类的静态属性:
■ MouseEvent.MOUSE_DOWN
■ MouseEvent.MOUSE_UP
■ MouseEvent.MOUSE_MOVE
mouseDown事件,是当鼠标指针处于某个影片的图形时,按下鼠标后发生的。等同于AS 2中的onPress。
mouseUp事件,是当鼠标指针处于某个影片的图形时,释放鼠标后发生的。等同于AS 2中的onRelease。
mouseMove事件,是当鼠标移动时发生的——但只在鼠标移动到该物体或影片时才发生。这点与 AS 2中不同,在AS 2中使用 onMouseMove 时,无论鼠标何时移动,无论指针在哪,都会将这个事件的信息传达给所有的影片剪辑。
然而,有时我们希望在忽略指针位置的情况下,侦听鼠标移动、弹起或按下。在AS 2中,使用 onMouseMove, onMouseUp和onMouseDown ,都不会关注鼠标的位置。而在AS 3中,虽然这些方法有所不同,但只要使用 stage 来侦听mouseDown, mouseUp和mouseMove,同样会将事件信息传达给所有的影片剪辑。
OK,说了不少,让我们先来看个例子吧。本章第一个示例,文档类MouseEvents.as,继续使用前几章的Ball 类,代码如下:
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class MouseEvents extends Sprite {
public function MouseEvents() {
init();
}
private function init():void {
var ball:Ball=new Ball ;
ball.x=100;
ball.y=100;
addChild(ball);
ball.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownBall);
ball.addEventListener(MouseEvent.MOUSE_UP,onMouseUpBall);
ball.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMoveBall);
stage.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownStage);
stage.addEventListener(MouseEvent.MOUSE_UP,onMouseUpStage);
stage.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMoveStage);
}
private function onMouseDownBall(event:MouseEvent):void {
trace("mouse down - ball");
}
private function onMouseUpBall(event:MouseEvent):void {
trace("mouse up - ball");
}
private function onMouseMoveBall(event:MouseEvent):void {
trace("mouse move - ball");
}
private function onMouseDownStage(event:MouseEvent):void {
trace("mouse down - stage");
}
private function onMouseUpStage(event:MouseEvent):void {
trace("mouse up - stage");
}
private function onMouseMoveStage(event:MouseEvent):void {
trace("mouse move - stage");
}
}
}
这个类只不过是建立了前面说过的三种鼠标事件的处理函数,先为ball建立侦听,再为stage建立侦听。通过这些可以让我们知道事件是何时发生的。大家可以通过这个文件来明白到底什么时候什么地方会触发这些事件,有些需要注意的地方:
■ ball事件只发生在鼠标经过 ball的时候。
■ 特别要注意, ball的mouseMove事件只在鼠标经过 ball的时候才发生。
■ 无论鼠标在哪,都会获得 stage事件——即使经过 ball的时候也会发生。这样一来,就会得到两个事件——一个是 ball的,一个是 stage的。
■ 不可能在没有 mouseDown事件的情况下,就出现了mouseUp事件。
现在大家已经掌握了本章的一些重要事件的基础,下面开始学习拖拽。