用户交互的基础知识

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

应用程序可使用 ActionScript 3.0 来创建交互性以响应用户活动。请注意,本节假定您已熟悉了 ActionScript 3.0 事件模型。有关详细信息,请参阅处理事件

捕获用户输入

用户交互(无论是通过键盘、鼠标、摄像头还是这些设备的组合)是交互性的基础。在 ActionScript 3.0 中,识别和响应用户交互主要涉及事件侦听。

InteractiveObject 类是 DisplayObject 类的一个子类,它提供了处理用户交互所需的事件和功能的通用结构。您无法直接创建 InteractiveObject 类的实例。而是由显示对象(如 SimpleButton、Sprite、TextField 以及各种 Flash 创作工具和 Flex 组件)从此类中继承其用户交互模型,因而它们共享同一个通用结构。这意味着,您为处理从 InteractiveObject 派生的一个对象中的用户交互而编写的代码以及学会的方法适用于所有其他对象。

重要概念和术语

在继续阅读本章内容之前,一定要先熟悉以下重要的用户交互术语:

字符代码
表示当前字符集中的字符的数字代码(与在键盘上按的键关联)。例如,尽管“D”和“d”是由美国英语键盘上的同一个键创建的,但它们具有不同的字符代码。

上下文菜单
当用户右键单击或使用特定的键盘鼠标组合时显示的菜单。上下文菜单命令通常直接应用于已单击的内容。例如,某个图像的上下文菜单可能包含用于在单独窗口中显示该图像以及下载该图像的命令。

焦点
指示所选的元素处于活动状态,而且该元素是键盘或鼠标交互的目标。

键代码
与键盘上的实际键对应的数字代码。

管理焦点

交互式对象可以按编程方式或通过用户动作来获得焦点。另外,如果将 tabEnabled 属性设置为 true,用户可通过按 Tab 将焦点从一个对象传递到另一个对象。请注意,默认情况下,tabEnabled 值为 false,但以下情况除外:

  • 对于 SimpleButton 对象,值为 true

  • 对于输入文本字段,该值为 true

  • 对于 buttonMode 设置为 true 的 Sprite 或 MovieClip 对象,该值为 true

在上述各种情况下,都可以为 FocusEvent.FOCUS_INFocusEvent.FOCUS_OUT 添加侦听器,以便在焦点更改时提供其他行为。这对文本字段和表单尤其有用,但也可以用于 sprite、影片剪辑或从 InteractiveObject 类进行继承的任何对象。下面的示例说明了如何使用 Tab 键启用焦点循环切换,以及如何响应后续的焦点事件。在本例中,每个正方形在收到焦点时将改变颜色。

注: Flash Professional 使用键盘快捷键来管理焦点;因此,若要正确模拟焦点管理,应在浏览器或 AIR 中测试 SWF 文件,而不是在 Flash 中进行测试。
var rows:uint = 10; 
var cols:uint = 10; 
var rowSpacing:uint = 25; 
var colSpacing:uint = 25; 
var i:uint; 
var j:uint; 
for (i = 0; i < rows; i++) 
{ 
    for (j = 0; j < cols; j++) 
    { 
        createSquare(j * colSpacing, i * rowSpacing, (i * cols) + j); 
    } 
} 
 
function createSquare(startX:Number, startY:Number, tabNumber:uint):void 
{ 
    var square:Sprite = new Sprite(); 
    square.graphics.beginFill(0x000000); 
    square.graphics.drawRect(0, 0, colSpacing, rowSpacing); 
    square.graphics.endFill(); 
    square.x = startX; 
    square.y = startY; 
    square.tabEnabled = true; 
    square.tabIndex = tabNumber; 
    square.addEventListener(FocusEvent.FOCUS_IN, changeColor); 
    addChild(square); 
} 
function changeColor(event:FocusEvent):void 
{ 
    event.target.transform.colorTransform = getRandomColor(); 
} 
function getRandomColor():ColorTransform 
{ 
    // Generate random values for the red, green, and blue color channels. 
    var red:Number = (Math.random() * 512) - 255; 
    var green:Number = (Math.random() * 512) - 255; 
    var blue:Number = (Math.random() * 512) - 255; 
     
    // Create and return a ColorTransform object with the random colors. 
    return new ColorTransform(1, 1, 1, 1, red, green, blue, 0); 
}

了解输入类型

Flash Player 10.1 和 Adobe AIR 2 版本引入了测试运行时环境是否支持特定输入类型的功能。您可以使用 ActionScript 测试设备当前是否部署了运行时:
  • 支持笔针或手指输入(或根本没有触摸屏输入)。

  • 为用户提供虚拟或物理键盘(或根本没有键盘)。

  • 显示光标(如果不显示,则与悬停在对象上方的光标有关的功能不起作用)。

输入发现 ActionScript API 包括:

通过输入发现 API,您可以利用用户的设备功能,或在这些功能不可用时提供备用功能。这些 API 对于开发移动应用程序和启用触摸的应用程序特别有用。例如,如果您的移动设备的界面带有用于笔针的小按钮,则可以为使用手指触摸进行输入的用户提供带有较大按钮的替代界面。以下代码用于如下应用程序:具有 createStylusUI() 函数,该函数可分配一组适合笔针交互的用户界面元素。另一个函数称为 createTouchUI(),可分配另一组适合手指交互的用户界面元素:

if(Capabilities.touchscreenType == TouchscreenType.STYLUS ){ 
    //Construct the user interface using small buttons for a stylus 
    //and allow more screen space for other visual content 
    createStylusUI(); 
} else if(Capabilities.touchscreenType = TouchscreenType.FINGER){ 
    //Construct the user interface using larger buttons 
    //to capture a larger point of contact with the device 
    createTouchUI(); 
}
为不同的输入环境开发应用程序时,考虑如下兼容性图表:

环境

supportsCursor

touchscreenType == FINGER

touchscreenType == STYLUS

touchscreenType == NONE

传统桌面

true

false

false

true

电容式触摸屏设备(绘图板、PDA 和检测轻微触摸的电话,例如 Apple iPhone 或 Palm Pre)

false

true

false

false

电阻式触摸屏设备(绘图板、PDA 和检测准确的高压接触的电话,例如 HTC Fuze)

false

false

true

false

非触摸屏设备(运行应用程序但不带有检测接触的屏幕的功能电话和设备)

false

false

false

true

注: 不同的设备平台可以支持输入类型的多种组合。使用此图表作为常规指南。