java - Android 2.2 SurfaceView#onTouchEvent() 每个事件被调用两次

标签 java android surfaceview

因此,我遵循了 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());
            }
        }

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

  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)

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

最佳答案

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

synchronized (getHolder()) {

确实应该这样

SurfaceHolder h = getHolder()
syncronized(h) {

这似乎解决了我的问题。

关于java - Android 2.2 SurfaceView#onTouchEvent() 每个事件被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5176555/

相关文章:

java - 在java中序列化

java - 为什么我可以使用接口(interface)枚举方法而不覆盖它们?

java - Recycler View 的 OnClickListener 不返回任何内容

android - 有没有办法在 Android 上预加载 AdMob 广告?

android - 谁在 mvp android 中调用 db 查询和 http get

android - getSupportedPictureSize() 返回一个 Nexus4 实际上不支持的值

SurfaceView 中的 Android 动画角色

java - Maven错误: Plugin's descriptor contains the wrong version

java - 正则表达式 : Insert space in the string after a matched pattern