Touch 事件处理Flash Player 10.1 和更高版本,Adobe AIR 2 和更高版本 在 ActionScript 中,基本触摸事件与其他事件(如鼠标事件)的处理方式相同。您可以侦听由 TouchEvent 类中的事件类型定义的一系列触摸事件。
注: 对于多个触摸点输入(例如,使用多个手指触摸设备),第一个接触点将调度鼠标事件和触摸事件。
处理基本触摸事件:
例如,当在启用触摸的屏幕上点击在 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 类提供了用于处理 touchBegin、touchMove 和 touchEnd 事件的值。 例如,您可以使用 touchBegin、touchMove 和 touchEnd 事件在用户触摸和移动显示对象时为其提供可视反馈: 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; } |
|