在 ActionScript 中,基本触摸事件与其他事件(如鼠标事件)的处理方式相同。您可以侦听由
TouchEvent 类
中的事件类型定义的一系列触摸事件。
注:
对于多个触摸点输入(例如,使用多个手指触摸设备),第一个接触点将调度鼠标事件和触摸事件。
处理基本触摸事件:
-
通过将
flash.ui.Multitouch.inputMode
属性设置为
MultitouchInputMode.TOUCH_POINT
,可以将您的应用程序设置为处理触摸事件。
-
将事件侦听器附加到从 InteractiveObject 类继承属性的类实例,如 Sprite 或 TextField。
-
指定要处理的触摸事件的类型。
-
调用事件处理函数以执行某些操作,从而响应事件。
例如,当在启用触摸的屏幕上点击在 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;
}
|
|
|