
Adobe

Adobe
图 1 所示的 PixelPerfect 范例应用程序可对窗口对象执行一些基本任务。这些任务包括创建窗口、调整窗口大小、移动和关闭窗口。

图 1。PixelPerfect 范例应用程序。
PixelPerfect 应用程序演示如何使用 Adobe AIR 的窗口 API 实现以下功能:
startResize() 方法调整窗口大小startMove() 方法移动窗口close() 方法关闭窗口注意: 本范例应用程序按原样提供, 用于教学目的。
若要充分利用本篇文章, 您需要以下软件和文件:
应具备使用 Flex Builder 构建应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 Flex 构建快速入门范例应用程序。
下载并安装 PixelPerfect 安装程序文件 (PixelPerfect.air)。若要在 Windows 中运行此应用程序, 请双击应用程序的桌面快捷方式, 或从“开始”菜单选择该文件。在 Mac OS X 中, 请双击 PixelPerfect 应用程序图标, 默认情况下该图标安装在 Applications 目录中。
PixelPerfect 提供了一个简单的用户界面, 用户通过该界面可以修改应用程序窗口。用户交互是使用 NativeWindow API 来实现的。PixelPerfect 支持以下用户交互:
mouseDown 事件触发应用程序逻辑使其运行, 该逻辑计算鼠标位置, 如果适当, 还会调用 NativeWindow.startResize() 方法。 mouseDown 事件触发应用程序逻辑, 该逻辑计算鼠标位置, 如果适当, 还会调用 NativeWindow.startMove() 方法。 keyDown 事件触发应用程序逻辑, 该逻辑检测是否按下了方向键。如果已按下, 则 NativeWindow 的 x 或 y 属性将增大或减小 1, 具体取决于所按下的方向键是向下键、向上键、向左键还是向右键。用户每次按下方向键时都会发生此过程。 keyDown 事件触发应用程序逻辑, 该逻辑检测是否同时按下了 Shift 键和方向键。如果已按下, 则 NativeWindow 的 width 或 height 属性将增大或减小 1, 具体取决于所按下的方向键是向下键、向上键、向左键还是向右键。用户每次同时按下 Shift 键和方向键时都会发生此过程。 alpha 属性, 该属性影响透明度水平。 doubleClick 事件触发应用程序逻辑, 该逻辑显式调用 NativeWindow 的 close() 方法。 keyDown 事件触发应用程序逻辑, 该逻辑检测是否按下了 Ctrl+N 组合键。如果已按下, 则创建 Ruler 类 (该类扩展 NativeWindow) 的新实例, 同时显示一个新的标尺窗口。 为了创建窗口, PixelPerfect 将一个新 Ruler 对象实例化。Ruler 类扩展 NativeWindow 类。在 Ruler 构造函数中创建 NativeWindowInitOptions 对象, 并将该对象传递至 NativeWindow 超类构造函数:
public function Ruler(width:uint = 300, height:uint = 300, x:uint = 50, y:uint = 50, alpha:Number = .4)
{
var winArgs:NativeWindowInitOptions = new NativeWindowInitOptions();
winArgs.systemChrome = NativeWindowSystemChrome.NONE;
winArgs.transparent = true;
super(winArgs);
//...
}
构造函数的其余部分初始化新窗口及其成员的属性。
startResize() 方法接收由 NativeWindowResize 类定义的一个常数值, 该值表示窗口中的边角, 用户从这个边角拖动窗口来调整窗口大小。startResize() 方法触发由系统控制的调整窗口大小的行为。
应用程序还根据键盘事件显式设置窗口边界。本例中不涉及 resize 事件。以下代码段在 switch 语句中设置窗口边界:
switch (e.keyCode){
case Keyboard.DOWN:
if (e.shiftKey)
height += 1;
else
y += 1;
drawTicks(bounds);
break;
case Keyboard.UP:
if (e.shiftKey)
height -= 1;
else
y -= 1;
drawTicks(bounds);
break;
case Keyboard.RIGHT:
if (e.shiftKey)
width += 1;
else
x += 1;
drawTicks(bounds);
break;
case Keyboard.LEFT:
if (e.shiftKey)
width -= 1;
else
x -= 1;
drawTicks(bounds);
break;
case 78:
createNewRuler();
break;
}
此代码段还显示用于移动窗口和创建新窗口的按键事件。
startMove() 方法用于开始由系统控制的移动窗口的行为。当鼠标设备控制移动时, PixelPerfect 范例应用程序使用此方法。
当方向键控制移动的参数时, PixelPerfect 通过增大或减小窗口的 x 或 y 属性, 一次一个像素地改变窗口边界。 (此代码包括在前一代码段的 switch 语句中。)
窗口的可见背景是添加至标尺舞台的 Sprite 对象。应用程序根据鼠标滚轮事件调整背景子画面的 alpha 属性, 从而更改背景的透明度:
private function onMouseWheel(e:MouseEvent):void
{
var delta:int = (e.delta < 0) ? -1 : 1;
if (sprite.alpha >= .1 || e.delta > 0)
sprite.alpha += (delta / 50);
}
}
对于要对桌面透明的窗口, 必须通过在传递至窗口构造函数的 NativeWindowsInitOptions 对象中将 transparent 属性设置为 true, 从而在创建窗口时启用透明度。一旦创建窗口, 就无法更改窗口的 transparent 属性。
调度 doubleclick 事件时, PixelPerfect 调用窗口的 close() 方法。
private function onDoubleClick(e:Event):void
{
close();
}
关闭窗口之后将调度 close 事件, 标志着关闭过程已完成。关闭窗口之后, 就无法将其重新打开。关闭窗口将释放与该窗口相关的资源 (除非在别处引用这些资源), 以便可以对这些资源进行垃圾回收。但是, 从不对 AIR 所创建的初始窗口进行垃圾回收。应用程序负责关闭其窗口, 以使相关资源可以得到释放。当关闭应用程序的最后一个窗口时, 应用程序也随之退出。通过将 NativeApplication 对象的 autoExit 属性设置为 false, 可以更改此默认行为。
通过设置舞台的 displayState 属性, 可以全屏显示窗口的内容:
private function onFullScreenMenuItem(e:ContextMenuEvent):void
{
stage.displayState =
(stage.displayState == StageDisplayState.NORMAL) ? StageDisplayState.FULL_SCREEN : StageDisplayState.NORMAL;
}
若要使某个窗口保持在其它窗口的前面 (包括其它应用程序的窗口), 请将窗口的 alwaysInFront 属性设置为 true:
private function toggleAlwaysInFront(e:Event):void
{
this.alwaysInFront = !this.alwaysInFront;
this.onTopMenuItem.checked = this.alwaysInFront;
}
有关 AIR 窗口 API 的方法和属性的详细信息, 请参阅《ActionScript 3.0 语言参考》*。
Charles Ward 是一名技术作者, 它喜欢钻研新技术。在之前的 (专业) 职业生涯中, 他曾参与创建开拓性的计算机游戏, 如 Falcon 3.0 和 4.0 以及 Star Trek: A Final Unity。在闲暇时间, Charles 喜欢自由潜水以及和他的孩子们玩耍。
Christian Cantrell 是 AIR 团队的技术产品经理。若要了解 Christian 提供的最新信息, 请阅读他的博客*。