【问题标题】:Why is my onTouchEvent being triggered without touching the screen?为什么我的 onTouchEvent 在不触摸屏幕的情况下被触发?
【发布时间】:2019-07-20 19:38:50
【问题描述】:

第一次触摸屏幕时,onTouchEvent 方法总是说事件为 0 (MotionEvent.ACTION_DOWN)。当我停止触摸屏幕时,我不知道如何让它报告。

stage 变量告诉它在三部分过程(开始、停止和释放)中它处于哪个水龙头编号(为类似弹射器的游戏制作)

public static int stage = 0;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                stage++;
                System.out.println(stage);
                handleTouches();
                System.out.println(onTouchEvent(event));
                return onTouchEvent(event);
        }
        return true;
    }
    public void handleTouches() {
        if (stage == 1) {
            runPowerBar = true;

        } else if (stage == 2) {
            runPowerBar = false;
            tree.startAnimation();
            bg.startFlight(power);
        }
    }

    public void update() {
        tree.update();
        setCoins(context, 0);
        //setCoins(context, coins);

        if (runPowerBar) {
            powerBar.powerBarSlider();
        }
        System.out.println(runPowerBar);
    }

更新方法被MainThread中下面的方法调用

 @Override
    public void run() {
        while (running) {
            canvas = null;

            try {
                canvas = this.surfaceHolder.lockCanvas();
                synchronized(surfaceHolder) {
                    this.gameView.update();
                    this.gameView.draw(canvas);
                }
            } catch (Exception e) {} finally {
                if (canvas != null) {
                    try {
                        surfaceHolder.unlockCanvasAndPost(canvas);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

我希望 onTouchEvent 告诉我,当我触摸时动作是向下的,当我不触摸时动作是向上的,但它只是保持在 0 表示向下。

7/22 更新:

好吧,经过一些测试,我发现更新方法仍然运行,但是 一旦我第一次点击,我的绘图方法就会冻结,并在第二次点击后恢复。当我松开水龙头时,它现在也会显示。

【问题讨论】:

  • 考虑OnTouchListener
  • 您在打印日志时调用 onTouchEvent(event),我认为这不是故意的
  • 谢谢,我删除了所有这些,它现在等待我点击它,唯一的事情是它会暂停其他所有内容,直到我再次点击。

标签: java android touch-event


【解决方案1】:

似乎你在那里有一个递归函数,你用ACTION_DOWN事件递归地调用onTouchEvent

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //Start of touch events 
                stage++;
                System.out.println(stage);
                handleTouches();
                System.out.println(onTouchEvent(event));
                //return onTouchEvent(event);
                return true;
            case MotionEvent.ACTION_UP:
                // End of touch events
                return true;
            case MotionEvent.ACTION_MOVE:
                // Moved touch events
                return true;
        }
        return true;
    }

【讨论】:

  • 哦不,您的主要问题是您返回onTouchEvent。我只是添加了其他案例来展示一个例子,因为你说当屏幕触摸停止时你不知道如何获取报告。
  • 好的,谢谢,它现在等待触摸,但它会暂停其他所有操作,直到我再次点击。有什么帮助吗?
  • 你是什么意思,它暂停一切?你的意思是,UI 线程冻结(并且你得到一个 ANR),或者你有一个特定的动画或停止的东西?
  • 在更新方法中我有 System.out.println(runpowerbar);并且这会不断输出 false 直到我点击然后它停止输出此消息直到我再次点击。基于此,我认为有些东西冻结了,因为我的更新方法停止运行。我还有一种方法可以在第一次点击后来回移动电源条选择器,但它只是保持静止。我知道这是可行的,因为在第一次点击后,它出现在与上次不同的位置。
  • 你在哪里调用这个update 方法,它有什么作用。将代码添加到问题中。
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
相关资源
最近更新 更多