【发布时间】:2012-07-30 22:45:17
【问题描述】:
我正在制作一款 iOS 游戏,我需要同时检测简单的点击和手势(滑动等)。在 AIR 中,我只能看到多点触控输入模式的一项设置:TOUCH_POINT(适用于基本点击)和 GESTURE。但我同时需要两者,所以改变模式不是一种选择。如何同时收听两者?
谢谢, 可以。
【问题讨论】:
标签: ios flash air multi-touch gesture-recognition
我正在制作一款 iOS 游戏,我需要同时检测简单的点击和手势(滑动等)。在 AIR 中,我只能看到多点触控输入模式的一项设置:TOUCH_POINT(适用于基本点击)和 GESTURE。但我同时需要两者,所以改变模式不是一种选择。如何同时收听两者?
谢谢, 可以。
【问题讨论】:
标签: ios flash air multi-touch gesture-recognition
import flash.events.EventDispatcher;
import flash.events.TouchEvent;
import flash.net.Responder;
import flash.ui.Multitouch;
import flash.ui.MultitouchInputMode;
public class SwipeAndTap extends EventDispatcher
{
private var fingerX:int;
private var fingerY:int;
private var elem:Object;
public function SwipeAndTap(_elem:Object)
{
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
elem = _elem;
elem.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
elem.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
elem.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);
}
private function onTouchBegin(e:TouchEvent):void
{
fingerX = e.stageX;
fingerY = e.stageY;
}
private function onTouchMove(e:TouchEvent):void
{
if(e.stageX > (fingerX+150) && (e.stageY > (fingerY-100) && e.stageY < (fingerY+100) ) )
{
// swipe right
dispatchEvent(new TouchSwipeRight(TouchSwipeRight.SWIPE_RIGHT, e));
}
else if(e.stageX < (fingerX-150) && (e.stageY > (fingerY-100) && e.stageY < (fingerY+100) ) )
{
// swipe left
dispatchEvent(new TouchSwipeLeft(TouchSwipeLeft.SWIPE_LEFT, e));
}
}
private function onTouchEnd(e:TouchEvent):void
{
// e.touchPointID;
if(e.stageX > (fingerX-40) && e.stageX < (fingerX+40))
{
dispatchEvent(new TouchEventTap(TouchEventTap.TAP, e));
elem.removeEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
elem.removeEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
elem.removeEventListener(TouchEvent.TOUCH_END, onTouchEnd);
}
}
}
例子:
var SAT:SwipeAndTap = new SwipeAndTap(stage);
SAT.addEventListener(TouchEventTap.TAP, LangSelected);
SAT.addEventListener(TouchSwipeRight.SWIPE_RIGHT, ENtoPL);
SAT.addEventListener(TouchSwipeLeft.SWIPE_LEFT, PLtoEN);
【讨论】:
我不太确定您是否需要为基本点击设置TOUCH_POINT。如果您设置了GESTURE,它应该也能正常工作。你可以用鼠标事件来模拟它。
无论如何,默认的 AIR 手势支持并不是那么好,所以它可能无法正常工作,因此我建议查看 Gestouch 库。你会得到更复杂的手势支持,效果很好。几个月以来,我一直在我的 Flex/AS3 项目中使用它,对此我感到非常满意。
【讨论】:
您可以使用标准鼠标事件进行点击。
这将保持手势多点触控输入模式。
否则,GitHub 上的Gestouch framework: NUI gestures detection framework for mouse, touch and multitouch AS3 development 可能会感兴趣。
另请注意触摸/手势事件模型的performance impacts:
触摸和手势输入都可以是多点触摸输入,具体取决于 用户的设备。 ActionScript 提供用于处理触摸事件的 API, 手势事件,以及单独跟踪的多点触控触摸事件 输入。
注意:监听触摸和手势事件可能会消耗大量 处理资源量(相当于渲染几帧 每秒),具体取决于计算设备和操作系统。 当您实际上不需要时,通常最好使用鼠标事件 触摸或手势提供的额外功能。当你使用 触摸或手势事件,考虑减少图形数量 可能发生的变化,尤其是在可以分派此类事件时 快速,如在平移、旋转或缩放操作期间。例如,你 可以在用户调整组件大小时停止组件内的动画 使用缩放手势。
【讨论】: