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;
}
|
|