Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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 Android 2.2 SurfaceView#onTouchEvent()将为每个事件调用两次_Java_Android_Surfaceview - Fatal编程技术网

Java Android 2.2 SurfaceView#onTouchEvent()将为每个事件调用两次

Java Android 2.2 SurfaceView#onTouchEvent()将为每个事件调用两次,java,android,surfaceview,Java,Android,Surfaceview,因此,我跟随2D图形教程(感兴趣的人,这是一个@),我在onTouchEvent()回调中遇到了不断的崩溃。我仍在尝试跟踪bug,但在尝试调试问题时,我注意到我的onTouchEvent回调会为每个事件调用两次 供再次参考 @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); synchronized (getHolde

因此,我跟随2D图形教程(感兴趣的人,这是一个@),我在onTouchEvent()回调中遇到了不断的崩溃。我仍在尝试跟踪bug,但在尝试调试问题时,我注意到我的onTouchEvent回调会为每个事件调用两次

供再次参考

@Override
    public boolean onTouchEvent(MotionEvent event) 
    {
        int action = event.getAction();
        synchronized (getHolder()) {
            if (action == MotionEvent.ACTION_DOWN) {
                if (gameObjects.size() < 2) {
                    currentlySelected = new GameObject(BitmapFactory.decodeResource(getResources(), R.drawable.icon));
                    currentlySelected.getCoordinates().setX((int) event.getX());
                    currentlySelected.getCoordinates().setY((int) event.getY());
                } else {
                    for (GameObject gameObject: gameObjects) {
                        if (gameObject.inBoundingBox(event.getX(), event.getY())) {
                            currentlySelected = gameObject;
                            break;
                        }
                    }

                    if (currentlySelected != null) {
                        // Remember to remove it from the list so that we don't waste time updating it in updatePhysics twice.
                        gameObjects.remove(currentlySelected);
                    }
                }
            } else if (action == MotionEvent.ACTION_UP && (currentlySelected != null)) {
                gameObjects.add(currentlySelected);
                currentlySelected = null;
            } else if (action == MotionEvent.ACTION_MOVE) {
                currentlySelected.getCoordinates().setX((int) event.getX());
                currentlySelected.getCoordinates().setY((int) event.getY());
            }
        }
@覆盖
公共布尔onTouchEvent(运动事件)
{
int action=event.getAction();
已同步(getHolder()){
if(action==MotionEvent.action\u DOWN){
if(gameObjects.size()<2){
currentlySelected=新游戏对象(BitmapFactory.decodeResource(getResources(),R.drawable.icon));
currentlySelected.getCoordinates().setX((int)event.getX());
currentlySelected.getCoordinates().setY((int)event.getY());
}否则{
用于(游戏对象游戏对象:游戏对象){
if(gameObject.inBoundingBox(event.getX(),event.getY()){
currentlySelected=游戏对象;
打破
}
}
如果(currentlySelected!=null){
//记住从列表中删除它,这样我们就不会浪费时间在updatePhysics中更新它两次。
gameObjects.remove(当前选择);
}
}
}else if(action==MotionEvent.action\u UP&&(currentlySelected!=null)){
gameObjects.add(当前选择);
currentlySelected=null;
}else if(action==MotionEvent.action\u MOVE){
currentlySelected.getCoordinates().setX((int)event.getX());
currentlySelected.getCoordinates().setY((int)event.getY());
}
}
否当我在第一行上放置断点,并在调试模式下运行它时,当我触摸屏幕时,将使用以下操作调用回调

  • 动作=0(MotionEvent.action\u向下)
  • 动作=0(MotionEvent.action\u向下)
  • action=1(MotionEvent.action\u MOVE)
  • action=1(MotionEvent.action\u MOVE)
  • action=2(MotionEvent.action\u UP)
  • action=2(MotionEvent.action\u UP)

  • 对于每个动作,第二个动作都会在同步调用时发出。有人知道这种行为的原因吗?

    首先,我自己就是一个完全的android新手

    根据开发人员文档,onTouchEvent方法要求您使用自己的方法实现覆盖该方法。这似乎不太实际,因为您需要在希望使用touchevent执行操作的位置扩展每个视图对象

    如果我从中理解正确,则必须实现各种事件侦听器之一(根据您的需要)而不是实现onTouchEvent方法。我的猜测是,如果您重写onTouchEvent,该方法必须自己搜索哪个事件处理程序适合该作业。因此,它必须再次将相同的信息传递给此事件侦听器,因此,我们有“两次”相同的事件调用

    这只是我的猜测,希望有人能证明这一点


    我也遇到了同样的情况,我会尝试一下上面提到的文档页面中的指南。如果这些内容发生了变化,我会让你知道的!

    事实证明,问题出在线路上

    synchronized (getHolder()) {
    
    应该是的

    SurfaceHolder h = getHolder()
    syncronized(h) {
    

    这似乎解决了我的问题。

    p.S.:我试了一下,就像上面描述的那样,但遇到了更多的麻烦……我想这对我来说是一条死胡同。。。