【问题标题】:How to listen for both tap and gestures at the same time in Adobe AIR for iOS?如何在 Adob​​e AIR for iOS 中同时收听点击和手势?
【发布时间】:2012-07-30 22:45:17
【问题描述】:

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

谢谢, 可以。

【问题讨论】:

    标签: ios flash air multi-touch gesture-recognition


    【解决方案1】:
    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);
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        否则,GitHub 上的Gestouch framework: NUI gestures detection framework for mouse, touch and multitouch AS3 development 可能会感兴趣。

        另请注意触摸/手势事件模型的performance impacts:

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

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

        【讨论】:

        • 使用鼠标事件进行触摸不会有问题吗?也许他们将来会在点击时删除鼠标功能模拟,因此触摸专用事件
        • “他们”是指谁? Flex 是一个 Apache 项目,我认为社区不会决定让 Flex 移动组件仅用于触摸事件。
        • 好吧抱歉,我以为它是由 Adob​​e 管理的。我现在已经使用鼠标事件实现了,并且使用标准手势效果非常好(在我的情况下没有性能影响)。
        • 但不会使用标准的鼠标点击事件进行“点击”触摸禁用多个同时触摸的能力?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-25
        相关资源
        最近更新 更多