辅助功能*

Charles Ward

Charles Ward

Adobe

Christian Cantrell

Christian Cantrell

Adobe

出版日期:
2008 年 2 月 28 日
用户级别:
中/高级
产品:
Adobe AIR

与窗口交互

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

Pixel Perfect 应用程序

图 1。PixelPerfect 范例应用程序。

PixelPerfect 应用程序演示如何使用 Adobe AIR 的窗口 API 实现以下功能:

  • 打开多个窗口
  • 获取对窗口的引用
  • 使用鼠标事件对窗口触发操作
  • 使用 NativeWindow 类的 startResize() 方法调整窗口大小
  • 使用 NativeWindowResize 类的常量指定如何完成调整窗口大小的操作
  • 使用 NativeWindow 类的 startMove() 方法移动窗口
  • 使用 NativeWindow 类的 close() 方法关闭窗口
  • 使用全屏模式
  • 使某个窗口保持在其它窗口的前面

注意: 本范例应用程序按原样提供, 用于教学目的。

要求

若要充分利用本篇文章, 您需要以下软件和文件:

Adobe AIR

Adobe Flex Builder 3

范例文件:

必备知识

应具备使用 Flex Builder 构建应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 Flex 构建快速入门范例应用程序

测试应用程序

下载并安装 PixelPerfect 安装程序文件 (PixelPerfect.air)。若要在 Windows 中运行此应用程序, 请双击应用程序的桌面快捷方式, 或从“开始”菜单选择该文件。在 Mac OS X 中, 请双击 PixelPerfect 应用程序图标, 默认情况下该图标安装在 Applications 目录中。

了解代码

PixelPerfect 提供了一个简单的用户界面, 用户通过该界面可以修改应用程序窗口。用户交互是使用 NativeWindow API 来实现的。PixelPerfect 支持以下用户交互:

  • 上下文菜单: 右键单击窗口, 打开窗口命令的菜单。
  • 拖动边角调整大小: mouseDown 事件触发应用程序逻辑使其运行, 该逻辑计算鼠标位置, 如果适当, 还会调用 NativeWindow.startResize() 方法。
  • 拖动中部进行移动: mouseDown 事件触发应用程序逻辑, 该逻辑计算鼠标位置, 如果适当, 还会调用 NativeWindow.startMove() 方法。
  • 用方向键一次移动一个像素: keyDown 事件触发应用程序逻辑, 该逻辑检测是否按下了方向键。如果已按下, 则 NativeWindow 的 xy 属性将增大或减小 1, 具体取决于所按下的方向键是向下键、向上键、向左键还是向右键。用户每次按下方向键时都会发生此过程。
  • Shift + 方向键一次将大小调整一个像素: keyDown 事件触发应用程序逻辑, 该逻辑检测是否同时按下了 Shift 键和方向键。如果已按下, 则 NativeWindow 的 widthheight 属性将增大或减小 1, 具体取决于所按下的方向键是向下键、向上键、向左键还是向右键。用户每次同时按下 Shift 键和方向键时都会发生此过程。
  • 鼠标滚轮更改不透明度: 为检测鼠标滚轮活动而创建的事件侦听器调用一个事件处理函数, 该处理函数确定转动鼠标滚轮的幅度和方向。这些值用于修改背景的 alpha 属性, 该属性影响透明度水平。
  • 双击退出: doubleClick 事件触发应用程序逻辑, 该逻辑显式调用 NativeWindow 的 close() 方法。
  • 按 Ctrl+N 创建窗口: 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 通过增大或减小窗口的 xy 属性, 一次一个像素地改变窗口边界。 (此代码包括在前一代码段的 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 提供的最新信息, 请阅读他的博客*