Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不抬起手指的情况下检测刷卡手势_Java_Android_Libgdx - Fatal编程技术网

Java 在不抬起手指的情况下检测刷卡手势

Java 在不抬起手指的情况下检测刷卡手势,java,android,libgdx,Java,Android,Libgdx,我正在用libgdx为android开发一个游戏,我有一个小问题,我想让它在用户刷卡时触发一个函数,这是我实现的。问题是,当您完成刷卡(当您抬起手指时)时,它会运行该功能。在刷卡时,如何使函数运行 这是手势侦听器的当前代码: private static class DirectionGestureListener extends GestureAdapter{ DirectionListener directionListener; public DirectionGest

我正在用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*/
    }
}));
我研究了libgdx源代码本身<每当发生
touchUp()
事件时,将执行code>fling()。因此与你的经历相一致

我认为实现这一点的一个选择是,通过扩展
InputAdapter
类或实现
InputProcessor
接口类,自己实现这样的手势检测,然后使用
touchDown()
,以及
TouchDrawed()
,以达到预期的效果

我们的想法是,当触摸id第一次在
touchDown()
内部的屏幕上触摸时,跟踪它(它的第三个参数是您正在查看的
int button
),然后使用该id在
touchDrawed()
内部进行检查和进一步操作。若id匹配,那个么对于简单的方法,您可以通过将其与原始触摸位置进行比较来检查用户是否触摸并移动了预定义的距离

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

从上面可以看出,将其视为滑动手势的条件可以包括以下内容(您可以自己进行调整)

  • 它相对于原始接触点移动的距离
  • 移动所需的持续时间(可能是150毫秒等),持续时间较长的用户可以更轻松地不快速地将其注册为滑动手势
  • 一次只能进行1次刷卡,即如果用户同时使用2个手指(2次触摸)刷卡,则只能使用第一个(或最后一个)作为刷卡效果,等等
根据您的需要分别处理x、y方向。如果是这样,您必须在
touchdrable()
中添加处理代码,以检查两个方向,并向您发送相应的事件,即swipe-x或swipe-y本身。然后你通过调用你的一个方法让你的游戏知道它