无需抬起手指即可检测滑动手势

时间:2017-08-27 07:32:04

标签: java android libgdx

我正在使用libgdx为Android开发游戏,我有一点问题,我想让它在用户滑动时触发一个功能,这是我实现的。问题是当你完成滑动(抬起手指)时它会运行该功能。如何在滑动操作时使功能运行?

这是手势监听器的当前代码:

private static class DirectionGestureListener extends GestureAdapter{

    DirectionListener directionListener;

    public DirectionGestureListener(DirectionListener directionListener){
        this.directionListener = directionListener;
    }

    @Override
    public boolean fling(float velocityX, float velocityY, int button) {
        if(Math.abs(velocityX)>Math.abs(velocityY)){
            if(velocityX>0){
                directionListener.onRight();
            }else{
                directionListener.onLeft();
            }
        }else{
            if(velocityY>0){
                directionListener.onDown();
            }else{
                directionListener.onUp();
            }
        }
        return super.fling(velocityX, velocityY, button);
    }

}

游戏场景:

Gdx.input.setInputProcessor(new SimpleDirectionGestureDetector(new SimpleDirectionGestureDetector.DirectionListener() {
    @Override
    public void onUp() { 
        /*something*/ 
    }

    @Override
    public void onRight() { 
        /*something*/ 
    }

    @Override
    public void onLeft() { 
        /*something*/ 
    }

    @Override
    public void onDown() { 
        /*something*/
    }
}));

1 个答案:

答案 0 :(得分:1)

我查看了libgdx源代码本身的GestureDetector.java。只要发生fling()事件,就会执行touchUp()。因此与你所经历的一致。

我认为实现这项工作的一个选择是通过扩展InputAdapter类或实现InputProcessor接口类来自己实现此类手势检测,然后处理touchDown()和{{1}达到你想要的效果。

我们的想法是跟踪触摸ID,因为它首先触及touchDragged()内的屏幕(其第三个参数是touchDown(),这就是您正在查看的内容),然后使用该ID检查并在int button内进一步操作。如果id匹配,那么对于简单的方法,您可以通过将用户与原始触摸位置进行比较来检查用户是否触摸并移动了预定距离。

假设我们只想在用户首次触摸屏幕时移动滑动手势,将其移动(至少)我们预定义的距离,并在预定义的持续时间内。因此,如果用户首先触摸屏幕,移动手指但仍然不超过预定距离,然后最终在我们设置的持续时间内移动足够远,这仍然不会被视为滑动我们的条件设定必须从第一次意图(第一次触摸)到做这样的姿势。这意味着我们计算距原始触摸点的距离,而不是移动点。当然,您也可以根据自己的需要定制条件。

从上面来看,将其视为轻扫手势的条件可以包括以下(您可以自己调整这些)

    与原始触点相比,
  • 距离移动
  • 持续时间它需要移动(可能是150毫秒等),持续时间更长的用户可以更轻松,不要快速行动,使其注册为轻扫手势
  • 一次只能刷卡即可生效,即如果用户同时使用2个手指(2个触摸)进行滑动,则只能使用第一个(或最后一个)作为滑动效果等。

根据您的需要单独处理x,y方向。如果是这样,您必须在touchDragged()内添加处理代码以检查两个方向并向您发送相应的事件,即swipe-x或swipe-y本身。然后你通过调用你的一种方法来解决它,让你的游戏知道。