【问题标题】:Android 2.2 SurfaceView#onTouchEvent() being called twice for each eventAndroid 2.2 SurfaceView#onTouchEvent() 为每个事件调用两次
【发布时间】:2011-07-07 18:53:58
【问题描述】:

所以我跟着一个 2D 图形教程(感兴趣的人,它是一个 @http://droidnova.com/),我到了在我的 onTouchEvent() 回调中遇到不断崩溃的地步。我仍在尝试跟踪错误,但在尝试调试问题时,我注意到我的 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());
            }
        }

不,当我在第一行设置断点并在调试模式下运行它时,当我触摸屏幕时,回调会被以下操作调用...

  1. 动作 = 0 (MotionEvent.ACTION_DOWN)
  2. 动作 = 0 (MotionEvent.ACTION_DOWN)
  3. 动作 = 1 (MotionEvent.ACTION_MOVE)
  4. 动作 = 1 (MotionEvent.ACTION_MOVE)
  5. 动作 = 2 (MotionEvent.ACTION_UP)
  6. 动作 = 2 (MotionEvent.ACTION_UP)

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

【问题讨论】:

    标签: java android surfaceview


    【解决方案1】:

    事实证明,问题出在这条线上

    synchronized (getHolder()) {
    

    应该是这样

    SurfaceHolder h = getHolder()
    syncronized(h) {
    

    这似乎解决了我的问题。

    【讨论】:

      【解决方案2】:

      首先,我自己是一个彻头彻尾的安卓新手。

      根据开发人员文档,onTouchEvent 方法要求您使用自己的实现来覆盖该方法。这似乎相当不切实际,因为您需要使用 touchevent 扩展每个您想要操作的视图对象。

      如果我从the android documentation for event handling 理解正确;必须实现各种事件侦听器之一(根据您的需要),而不是实现 onTouchEvent 方法。我的猜测是,如果您确实覆盖了 onTouchEvent,该方法必须自己搜索哪个事件处理程序适合该工作。因此它必须再次将相同的信息传递给该事件侦听器,因此,我们有“两次”相同的事件称为...

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

      我也有同样的情况,我会尝试在此处提到的文档页面中编写的指南。如果这发生了变化,我会通知你的!

      【讨论】:

      • P.S.:我按照文档描述的方式进行了尝试,但遇到了更多麻烦……猜想这对我来说是个死胡同……
      猜你喜欢
      • 2016-08-18
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 2014-01-24
      • 2021-07-12
      相关资源
      最近更新 更多