22.5. Flash Player级别的输入事件
正如我们到本章目前为止所学习的,多数的FlashPlayer输入事件都是由于用户与显示列表中特定的对象发生交互行为而引发的。但是, Flash Player同样支持另一小类事件,这些事件是用户与FlashPlayer应用程序本身的交互而引发的。我们将这些“应用程序事件”归类为FlashPlayer级别的输入事件,它们在下列情况下被派送:
• 当Flash Player的显示区域被重新调整大小
• 当鼠标指针移出 Flash Player'的显示区域
• 当Flash Player应用程序获得/丢失操作系统焦点(独立的Flash播放器在应用程序窗口获得焦点的时候获得系统焦点;网页浏览器内嵌的Flash播放器在如下情况获得焦点:当用户点击Flash播放器可显示区域的时候;或者(如果支持的话),用户通过键盘导航到这个内嵌的Flash播放器对象)
Table 22-5 列出了Flash Player级别输入事件的种类. 每种事件中, "事件类型" 一栏列出了描述Event事件类型的正式字符串常量, "描述" 一栏描述了这个事件代表的用户操作。(FP级别型输入事件没有默认行为)"目标"一栏列出了这个事件派送的目标,"默认行为" 一栏列出了Flash Player对这个事件的原生反应。"冒泡"一栏列出该事件是否支持冒泡阶段。"传递给侦听器函数的数据类型" 一栏列出了传递给事件处理函数的对象的数据类型,最后“注释”一栏列出了关于使用这种事件的重要信息
我们来详细看一下 Table 22-5中介绍的事件
22.5.1. Event.ACTIVATE 与Event.DEACTIVATE 事件
Event.ACTIVATE与 Event.DEACTIVATE 事件一般用于开发一类应用程序,这类程序可以根据FP得失OS焦点让程序自身可使用或不可使用。 比如,当FP丢失程序焦点,作为响应,应用程序会静音,解除一个open菜单,或者暂停播放中的动画。
不像其他输入事件, Event.ACTIVATE 和Event.DEACTIVATE事件没有捕获阶段和冒泡阶段。作为代替, Event.ACTIVATE 和 Event.DEACTIVATE可以被任何继承自EventDispatcher的类的实例注册侦听, (注意:不仅限于是继承自DisplayObject的类). 此外,当一个侦听器函数被注册在一个显示对象上以侦听Event.ACTIVATE或 Event.DEACTIVATE 事件时,即使该对象不在显示列表也可以调用侦听器函数。
Example 22-18 提供了Event.ACTIVATE和Event.DEACTIVATE的基本用法。该程序当FP获得OS焦点时开始播放“旋转的方块”动画,当FP丢失焦点时停止(我们将在Chapter 24学习动画技术)。
Example 22-18. 应答Event.ACTIVATE 和 Event.DEACTIVATE事件
22.5.2. Event.RESIZE 事件
Event.RESIZE 事件一般用于当发开一个带有"stretchy"内容的应用程序,其界面元素会自动调整尺寸以匹配FP可视区域的可用空间。Event.RESIZE 事件派送的条件为:当FP的Stage 实例的 scaleMode属性被设置为StageScaleMode.NO_SCALE 并且Flash Player的显示区域的大小发生变化时。如下情况会改变显示区域的大小:
• 独立的播放器被用户重新调整大小或者响应一个fscommand("fullscreen", "true")呼吁.
• 用户调整了浏览器的尺寸,这个浏览器使用百分率值在 <OBJECT> 或者 <EMBED> 标签的 HEIGHT 或者WIDTH 属性以嵌入了一个.swf文件.
下面的HTLM代码展示了如何使用百分率值在 <OBJECT>或者 <EMBED> 标签的HEIGHT 或者WIDTH 属性以向网页中嵌入.swf文件。注意一个方向被设置为固定像素值 (HEIGHT="75") 而另一个为设置为百分制 (WIDTH="100%").
<OBJECTclassid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"
WIDTH="100%"
HEIGHT="75">
<PARAM NAME="movie" VALUE="app.swf">
<EMBEDsrc="app.swf" WIDTH="100%" HEIGHT="75" TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.adobe.com/go/getflashplayer">
</EMBED>
</OB JECT>
侦听Event.RESIZE 事件的侦听器必须注册在FlashPlayer的Stage实例上, 如下面的代码所示。注意将scaleMode 设置为StageScaleMode.NO_SCALE 的这个强制设定。
package {
import flash.display.*;
import flash.events.*;
public class ResizeSensor extends Sprite {
public function ResizeSensor () {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.addEventListener(Event.RESIZE, resizeListener);
}
private function resizeListener (e:Event):void {
trace("Flash Player was resized");
}
}
}
Example 22-19 扩展了前面的代码,如何在它展示了每当Flash Player 被重新调整大小的时候,定位一个Sprite对象,rect, 到Flash Player可视区域的右上角。注意这个范例程序需要手动调用它的初始化布局代码,因为当一开始一个 .swf 文件加载到播放器的时候不会触发Event.RESIZE
Example 22-19. 一个可伸缩的布局
常量
定义方
: = "exactFit"
[静态] 指定整个应用程序在指定区域中可见,但不尝试保持原始高宽比。
StageScaleMode
: = "noBorder"
[静态] 指定整个应用程序填满指定区域,不会发生扭曲,但有可能会进行一些裁切,同时保持应用程序的原始高宽比。
StageScaleMode
: = "noScale"
[静态] 指定应用程序的大小是固定的,因此,即使在更改播放器窗口大小时,它仍然保持不变。
StageScaleMode
: = "showAll"
[静态] 指定整个应用程序在指定区域中可见,且不会发生扭曲,同时保持应用程序的原始高宽比。
StageScaleMode
package
{
import flash.display.*;
import flash.events.*;
// 每当FP大小被调整,移动Sprite到右上角
public class StretchyLayout extendsSprite
{
private var rect:Sprite;
public function StretchyLayout()
{
//初始化并添加到显示列表
rect = new Sprite ;
rect.graphics.lineStyle();
rect.graphics.beginFill(0x0000FF);
rect.graphics.drawRect(0,0,150,75);
addChild(rect);
//内容的大小不随播放器窗口大小变化
stage.scaleMode = StageScaleMode.NO_SCALE;
//将 .swf 文件对齐在Flash Player可视区域的左上角
stage.align =StageAlign.TOP_LEFT;
//注册Event.RESIZEevents
stage.addEventListener(Event.RESIZE,resizeListener);
//手动调用初始化布局代码
positionRectangle();
}
//Handles Event.RESIZE events
private functionresizeListener(e:Event):void
{
positionRectangle();
}
// 将 rect 放到Flash Player可视区域的右上角 top-right
private functionpositionRectangle():void
{
rect.x = stage.stageWidth -rect.width;
rect.y = 0;
}
}
}
22.5.3. Event.MOUSE_LEAVE 事件
Event.MOUSE_LEAVE 事件一般用于当鼠标指针离开播放器可视区域的时候移除或禁用一个鼠标反应内容。比如,在一个程序中隐藏了系统鼠标指针替换为一个自定义的指针图形( Example 22-5所示),这个自定义指针的图形会在鼠标离开播放器的时候隐藏。同Event.RESIZE 事件一样, Event.MOUSE_LEAVE事件的侦听器必须注册在Flash Player的Stage 实例上。下面的代码为处理Event.MOUSE_LEAVE事件所需的基本代码:
package {
import flash.display.*;
import flash.events.*;
public classMouseLeaveSensor extends Sprite {
public function MouseLeaveSensor () {
//注册 Event.MOUSE_LEAVE事件
stage.addEventListener(Event.MOUSE_LEAVE,mouseLeaveListener);
}
// 处理 Event.MOUSE_LEAVE events
private function mouseLeaveListener (e:Event):void {
trace("The mouse hasleft the building.");
}
}
}
22.6. 从程序到屏幕
在前面的几章我们学习了很多创建视觉内容以及应用它们作为用户交互的响应。在下一章,我们将学习Flash如何在程序中运行时自动更新屏幕以符合当前的显示内容一旦我们熟练了flash运行时屏幕更新系统,我们就转到Chapter 24, 在那我们将学习屏幕更新循环用来创建程序化的动画。