2

我正在制作一个 iOS 游戏,我需要同时检测简单的点击和手势(滑动等。在 AIR 中,我只能看到多点触控输入模式的一项设置:TOUCH_POINT(适用于基本点击)和 GESTURE。但我同时需要两者,所以改变模式不是一种选择。我怎样才能同时听这两个?

谢谢,坎。

4

3 回答 3

3
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);
于 2012-12-13T18:55:54.637 回答
1

您可以使用标准鼠标事件进行点击。

这将保持手势多点触控输入模式。

否则,可能会对 Gestouch 框架: GitHub 上用于鼠标、触摸和多点触控 AS3 开发的 NUI 手势检测框架感兴趣。

还要注意触摸/手势事件模型的性能影响:

取决于用户的设备,触摸和手势输入都可以是多点触摸输入。ActionScript 提供用于处理触摸事件、手势事件和单独跟踪的多点触摸输入的触摸事件的 API。

注意:监听触摸和手势事件可能会消耗大量的处理资源(相当于每秒渲染几帧),具体取决于计算设备和操作系统。当您实际上不需要触摸或手势提供的额外功能时,通常最好使用鼠标事件。当您确实使用触摸或手势事件时,请考虑减少可能发生的图形更改量,尤其是当此类事件可以快速调度时,例如在平移、旋转或缩放操作期间。例如,您可以在用户使用缩放手势调整组件大小时停止组件内的动画。

于 2012-08-02T06:24:10.517 回答
1

我不太确定您是否需要设置TOUCH_POINT基本敲击。如果你已经GESTURE准备好了,它应该也能正常工作。您可以使用鼠标事件来模拟它。

无论如何,默认的 AIR 手势支持并不是那么好,所以它可能无法正常工作,因此我建议查看Gestouch库。你会得到更复杂的手势支持,效果很好。几个月以来,我一直在我的 Flex/AS3 项目中使用它,我对它非常满意。

于 2012-08-02T06:24:29.507 回答