Touch 事件处理

Flash Player 10.1 和更高版本,Adobe AIR 2 和更高版本

在 ActionScript 中,基本触摸事件与其他事件(如鼠标事件)的处理方式相同。您可以侦听由 TouchEvent 类中的事件类型定义的一系列触摸事件。
注: 对于多个触摸点输入(例如,使用多个手指触摸设备),第一个接触点将调度鼠标事件和触摸事件。
处理基本触摸事件:
  1. 通过将 flash.ui.Multitouch.inputMode 属性设置为 MultitouchInputMode.TOUCH_POINT,可以将您的应用程序设置为处理触摸事件。

  2. 将事件侦听器附加到从 InteractiveObject 类继承属性的类实例,如 Sprite 或 TextField。

  3. 指定要处理的触摸事件的类型。

  4. 调用事件处理函数以执行某些操作,从而响应事件。

例如,当在启用触摸的屏幕上点击在 mySprite 上绘制的正方形时,以下代码显示一则消息:

Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; 
 
var mySprite:Sprite = new Sprite(); 
var myTextField:TextField = new TextField(); 
 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
 
mySprite.addEventListener(TouchEvent.TOUCH_TAP, taphandler); 
 
function taphandler(evt:TouchEvent): void { 
    myTextField.text = "I've been tapped"; 
    myTextField.y = 50; 
    addChild(myTextField); 
}

Touch 事件属性

发生某个事件时,将创建一个事件对象。TouchEvent 对象包含有关触摸事件的位置和条件的信息。您可以使用事件对象的属性检索该信息。

例如,以下代码创建 TouchEvent 对象 evt,然后在文本字段中显示事件对象的 stageX 属性(发生触摸的舞台空间中该点的 x 坐标):

Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; 
 
var mySprite:Sprite = new Sprite(); 
var myTextField:TextField = new TextField(); 
 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
 
mySprite.addEventListener(TouchEvent.TOUCH_TAP, taphandler); 
 
function taphandler(evt:TouchEvent): void { 
myTextField.text = evt.stageX.toString; 
myTextField.y = 50; 
addChild(myTextField); 
}
请参阅通过事件对象提供的属性的 TouchEvent 类。
注: 并非所有运行时环境都支持所有 TouchEvent 属性。例如,并非所有启用触摸的设备都能够检测用户应用到触摸屏的压力。因此,这些设备不支持 TouchEvent.pressure 属性。尝试测试是否支持特定属性以确保您的应用程序能够正常工作,有关详细信息,请参阅疑难解答

触摸事件阶段

跟踪 InteractiveObject 内外的各种舞台中的触摸事件,就像您跟踪鼠标事件一样。并且,跟踪触摸交互开头、中间和结尾中的触摸事件。TouchEvent 类提供了用于处理 touchBegintouchMovetouchEnd 事件的值。

例如,您可以使用 touchBegintouchMovetouchEnd 事件在用户触摸和移动显示对象时为其提供可视反馈:

Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
var mySprite:Sprite = new Sprite(); 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
var myTextField:TextField = new TextField(); 
myTextField.width = 200; 
myTextField.height = 20; 
addChild(myTextField); 
 
mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); 
stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
function onTouchBegin(event:TouchEvent) { 
    myTextField.text = "touch begin" + event.touchPointID; 
} 
function onTouchMove(event:TouchEvent) { 
    myTextField.text = "touch move" + event.touchPointID; 
} 
function onTouchEnd(event:TouchEvent) { 
    myTextField.text = "touch end" + event.touchPointID; 
}
注: 将初始触摸侦听器附加到 mySprite,但不要附加用于移动和结束触摸事件的侦听器。如果用户的手指或指针设备先于显示对象移动,则舞台将继续侦听触摸事件。

触摸点 ID

编写用于响应触摸输入的应用程序需要 TouchEvent.touchPointID 属性。Flash 运行时为每个触摸点分配一个唯一的 touchPointID 值。当应用程序响应触摸输入阶段或触摸输入的移动时,请先检查 touchPointID,然后再处理该事件。Sprite 类的触摸输入拖动方法将 touchPointID 属性用作参数,以便处理正确的输入实例。touchPointID 属性确保事件处理函数响应正确的触摸点。否则,事件处理函数将响应设备上触摸事件类型的任何实例(例如,所有 touchMove 事件),从而产生不可预测的行为。此属性在用户拖动对象时特别重要。

使用 touchPointID 属性可以管理整个触摸序列。触摸序列包含一个 touchBegin 事件、0 个或多个 touchMove 事件和一个 touchEnd 事件,所有这些事件都具有相同的 touchPointID 值。

以下示例建立了一个变量 touchMoveID,用于测试正确的 touchPointID 值,以便对触摸移动事件做出响应。此外,其他触摸输入也会触发事件处理函数。请注意,用于侦听移动和结束阶段的侦听器位于舞台上,而不是显示对象上。舞台将侦听移动或结束阶段,以防用户的触摸移动到显示对象边界以外。
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
var mySprite:Sprite = new Sprite(); 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
var myTextField:TextField = new TextField(); 
addChild(myTextField); 
myTextField.width = 200; 
myTextField.height = 20; 
var touchMoveID:int = 0; 
 
mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); 
function onTouchBegin(event:TouchEvent) { 
    if(touchMoveID != 0) { 
        myTextField.text = "already moving. ignoring new touch";     
        return; 
    } 
    touchMoveID = event.touchPointID; 
 
    myTextField.text = "touch begin" + event.touchPointID; 
    stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
    stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
} 
function onTouchMove(event:TouchEvent) { 
    if(event.touchPointID != touchMoveID) { 
        myTextField.text = "ignoring unrelated touch"; 
        return; 
    } 
    mySprite.x = event.stageX; 
    mySprite.y = event.stageY; 
    myTextField.text = "touch move" + event.touchPointID; 
} 
function onTouchEnd(event:TouchEvent) { 
    if(event.touchPointID != touchMoveID) { 
        myTextField.text = "ignoring unrelated touch end"; 
        return; 
    } 
    touchMoveID = 0; 
    stage.removeEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
    stage.removeEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
    myTextField.text = "touch end" + event.touchPointID; 
}