[EssentialActionScript3.0中文版]无责任翻译-22章交互性(1)
刚接触as3的时候,边对着字典边翻译的,知识不足所以很多地方翻得不对,由于太懒现在也不打算再改了。。
Chapter 22. Interactivity
本章,我们会学习通过响应FP的输入事件,为应用程序增加互动性。我们学习5种类型的输入事件:
•Mouseevents
•Focusevents
•Keyboardevents
•Textevents
•FlashPlayer-level events
我们会为上面的每一种事件研究Flash Player's API 提供的特殊事件以及处理这些事件的代码.
这一章中包含的事件的描述都特殊应用于Flash Player(不管是浏览器附加组件还是单独的版本), 但是一般也适用于任何支持鼠标和键盘输入的FLASH运行。 (比如 ##[apollo]). 当工作在其他的Flash runtimes的时候,必须要查阅输入事件的文档信息。要官方的FP输入事件的资料,请看Adobe's ActionScript Language Reference 位于Event类和它的子类的"Constants" 中以及TextField, DisplayObject,InteractiveObject, 和 Stage类的"Events" 标题下。
在我们学习这些特殊的输入事件之前,我们先来浏览一下所有输入事件的一般规则.
InteractiveObject Instances Only 交互性对象实例独有
输入事件的事件通知都发送自一个继承InteractiveObject类的子类 (i.e., Sprite, TextField,Stage, Loader,MovieClip, SimpleButton 以及这些类的孙类),其他类型的对象不会收到输入事件的通知,即使他们在显示列表中。比如,一个Shape 类的实例被放到了显示列表,但是Shape 类没有继承nteractiveObject, 所以 Shape 的实例收不到输入事件的通知。如果一个Shape 对象看上去和一个TextField 对象重叠了,那么当用户点击Shape 对象, 这个TextField 对象——而不是Shape 对象——将成为鼠标点击事件的目标。要处理针对Shape 或者 Bitmap 对象的交互事件,可以把他们放到一个容器中 (Sprite orMovieClip) 然后为这个容器注册输入事件的侦听。
Display List Objects Only 显示列表对象独有
不再显示列表里的对象,当FP发送一个输入事件时,他们无法收到该事件的通知。
Default Behavior 默认行为
一些输入事件会引发FlashPlayer的原生响应,称为default behavior. 比如,移动鼠标指针划过一个SimpleButton实例会让这个实例变为"划过"-状态的图形。一些情况下, Flash Player的默认行为可以通过使用Event 类的实例方法preventDefault()来阻止。详细请看Chapter 12.的"Preventing Default EventBehavior"
现在来学习事件!
22.1. 鼠标输入事件
当用户使用系统的点击装置时,Flash Player 会发送一个鼠标点击输入事件。可以触发鼠标输入事件的例子有:鼠标、轨迹球、触摸板、点击棒等。为了方便,本书都使用鼠标来实现点击操作。下面几种类型的鼠标操作可以触发鼠标输入事件:
• 按下或者释放鼠标的主按钮
• 移动鼠标指针
• 使用鼠标的卷动装置(比如旋转鼠标滚轮)
注意,上面的清单没有包含“右击”(按下鼠标的次要按钮)。Flash Player 只能通过主按钮的点击来触发鼠标事件。但是Flash Player的上下文菜单可以被次要按钮的点击来调用;更多详细,请看AdobeActionScript 语言参考的ContextMenu 类。
【现在已经有了,最新的flashplayer11终于内置了鼠标右键和鼠标中建事件,同时上下文菜单可以隐藏】
22.1.1. Flash Player的内置鼠标事件
Table 22-1 列出了Flash Player的内置鼠标事件的种类。对每一种类型,在“事件类型”一列,列出了这个MouseEvent-类常量,正式地代表了这个类型的字符串。在“描述”一列,列出了调用这个事件的特殊用户操作。在“目标”一列,列出了当事件派送出时事件的目标对象。在“默认行为”一列,列出了Flash Player对这个事件的天生的反应。在“冒泡”一列,列出了这个时间是否支持冒泡阶段。在“传递给侦听器函数的数据类型”一列,列出了传递给对事件进行处理的侦听器函数的对象的特定数据类型。最后在“注释”一列列出了关于使用这个事件的重要信息.
花一点时间通过Table 22-1来了解Flash Player的鼠标事件。这里有一些一般的注意点在你看表的时候:
系统焦点
下面的事件即使在Flash Player丢失系统焦点的时候仍然会触发:
MouseEvent.MOUSE_MOVE, MouseEvent.MOUSE_OVER,
MouseEvent.MOUSE_OUT, MouseEvent.ROLL_OVER,以及
MouseEvent.ROLL_OUT.
其他的鼠标事件仅仅在FlashPlayer具有系统焦点的时候才能触发.
位置事项
当用户把鼠标移出Flash播放器的可视范围的时候鼠标事件将无法触发,但是有一个例外。这个例外是:如果用户在flash播放器范围内按下了鼠标按钮然后在播放器范围之外松开他, MouseEvent.MOUSE_UP事件仍然会触发。要在鼠标指针移出播放器范围的时候得到通知,注册Event.MOUSE_LEAVE 事件,这将会在后面的"Flash Player-Level Input Events."讨论。
被主类实例忽略的矢量图形
通过.swf 文件主类的实例属性graphics与一个矢量图形进行的鼠标交互不会触发鼠标事件。但是,通过InteractiveObject 或其子类的实例属性graphics与一个矢量图形进行的鼠标交互可以触发鼠标事件。
.
无法取消的默认行为
Flash Player对鼠标事件响应的任何默认行为都无法被阻止。
立刻更新屏幕
要在处理完任何鼠标事件之后立刻刷新屏幕,使用MouseEvent 类的实例属性updateAfterEvent().
22.1.2. 登记鼠标事件
注册一个侦听鼠标事件的侦听器一般如下:
1. 基于在Table22-1中的"描述"一栏,在“事件类型“一栏中找到需要的描述常量。
2. 创造一个具有单一参数且类型为MouseEvent的侦听器函数。
3. 查阅Table22-1的"目标"一栏来确定该事件的目标对象。
4. 最后,给事件目标对象(为了目标阶段的通知)或者事件目标的父级对象(为了捕获或者冒泡阶段的通知)注册一个侦听器函数。大部分鼠标事件都是在目标阶段被侦听器处理的,被注册的是事件对象(接收输入的对象)。
我们把上面的步骤加到例子里去,假设我们希望注册一个侦听器来侦听器下面的TextField对象被点击:
var theTextField:TextField = new TextField();
theTextField.text = "Click here";
theTextField.autoSize = TextFieldAutoSize.LEFT;
theTextField.border = true;
theTextField.background = true;
theTextField.selectable = false;
我们按照下面的步骤:
1. 根据Table 22-1中的"描述"一栏, 我们判断"mouse clicking"这个事件常量是MouseEvent.CLICK.
2. 接下来,我们创建一个函数clickListener(), 它将会在MouseEvent.CLICK 发生的时候被通知。我们小心地设置clickListener()'的参数类型为MouseEvent.
private function clickListener(e:MouseEvent):void {
trace("Mouse wasclicked");
}
3. 接下来,参考Table 22-1的"目标" 一栏,我们找到MouseEvent.CLICK 事件派送的目标是我们点击的InteractiveObject对象。我们希望知道theTextField何时被点击,所以我们需要为theTextField或者它的父级显示对象注册一个侦听.
4. 在这个例子,我们直接为theTextField对象注册clickListener() 侦听器,如下:
theTextField.addEventListener(MouseEvent.CLICK, clickListener);
上面步骤最后的结果就是,每当用户点击theTextField , clickListener()方法都会被调用。
Example 22-1 展示了上面的代码为一个简单的类:ClickableText.
Example 22-1. 处理MouseEvent.CLICK事件
![](https://i-blog.csdnimg.cn/blog_migrate/fc22d7fd53df5c1f9397c8d5099de3cd.jpeg)
非常好。让我们再尝试一些别的例子。下面的代码注册了一个mouseMoveListener() ,在鼠标移过
Sprite 对象的时候调用,Sprite 是一个triangle对象。
![](https://i-blog.csdnimg.cn/blog_migrate/faf68aebd40c9f3040495d2a85d67298.jpeg)
如前面的代码所展示的,可以在处于显示列表中的对象上为几乎大部分的鼠标事件注册侦听器。但是,除非或直到对象被添加到显示列表,否则侦听器不会被调用。
NOTE
一个对象在被添加到显示列表之前无法接收输入事件。
Example 22-2 把前面的三角形代码放到一个.swf 主类MouseMotionSensor的上下文中。在这个例子中, triangle 被添加到显示列表以实现接收输入事件.
Example 22-2. 处理三角形上的MouseEvent.MOUSE_MOVE 事件
Example 22-2中的侦听器定义和事件注册代码的基础可以适用于任何Table 22-1中的事件
在鼠标指针坐标变化之后,通过更新一个对象的坐标,我们可以使这个对象好像跟随着鼠标。Example 22-5 展示了一个自定义鼠标指针代码。这个例子包含了大量我们目前所学到的技术。特别是,这个例子基于我们在第20章的"Custom Event.ADDED_TO_STAGEand Event.REMOVED_FROM_STAGE Events" 中使用的 StageDetector类。
这个例子也包含了2个我们还没有学习的技术: 坐标变换和事件过后立刻更新屏幕. 在代码注释中有前后对照支持信息。
22.1.3.鼠标事件与重叠的显示对象们
默认情况下,当一个鼠标事件发生在2个或更多的重叠着的InteractiveObject 实例上时,FlashPlayer 把事件的目标设置为可看到的处于最前方的实例。位于这个对象后面的对象将不会收到事件通知。比如说,如果一个TextField 对象与一个Sprite 对象重叠了,并且用户点击了TextField 对象,那么Flash Player 会派送一个目标仅仅指向TextField 的 MouseEvent.CLICK 事件。
Sprite 对象将不会收到鼠标点击的通知。
Example22-3 展示了一个简单的程序来证明前面的“TextField 位于 Sprite 上方“的例子。这个应用程序
这个应用程序的主类ClickSensor, 在一个叫做circle的Sprite对象上注册了一MouseEvent.CLICK 侦听器, 这个Sprite0对象与一个TextField 对象, textfield.有重叠部分。当clickListener() 被调用,它把circle向右移动10像素.
Example 22-3. 一个注册在部分重叠的对象上的鼠标侦听
![](https://i-blog.csdnimg.cn/blog_migrate/39397321514eea4d2153df1fb7fba5fe.jpeg)
Figure 22-1 展示了Example 22-3代码的输出
ClickSensor 程序运行,如果用户点击circle的可见部分,circle 会向右移。但是如果用户点击circle被textfield遮住的部分, circle 将接收不到MouseEvent.CLICK通知也就不会移动.
但是我们可以强制textfield 忽略所有的鼠标事件,这样即使circle被textfield遮盖它仍然可以收到鼠标事件,要强制textfield忽略所有鼠标事件我们设置它的mouseEnabled属性为false:
textfield.mouseEnabled = false;
如果上面这行代码被添加到ClickSensor'的构造函数中,那么不管是在circle的可见还是不可见区域进行的点击都会使得circle向右移。当一个InteractiveObject 实例的 mouseEnabled属性被设置为false,它将接收不到任何鼠标输入事件通知,作为替代,这个实例所处显示列表下一层高度的InteractiveObject实例会接收到这个事件。