【问题标题】:Android, peculiar TouchEvent scenario to handleAndroid,要处理的特殊 TouchEvent 场景
【发布时间】:2011-05-10 01:08:33
【问题描述】:

好的,所以在业余时间创建游戏时,我在尝试围绕以下场景编写代码时完全被卡住了:

我想捕捉点击事件 (TouchEvent.ACTION_DOWN),然后每隔 500 毫秒,我想检查一下屏幕是否仍然被按下,然后无限重复相同的动作。

所以,我开始了:

switch (myTouchHandler.getAction()) {
  case (TouchEvent.ACTION_DOWN):
  case (TouchEvent.ACTION_MOVE):
    if (inputIntervalTooSoon()) return true;
    //do the magic i intend to do....
 }

....

private boolean inputIntervalTooSoon() {
        final long now = System.currentTimeMillis();
        if ((now - lastTouchEventTime) < 500) return false;
        lastTouchEventTime = now;
        return true;

这会产生它会等待 500 毫秒的效果,但它不会立即开始检测我的手指是否仍然向下。如果我稍微移动一下手指,它就会重新拾起它,然后回到休眠状态。

如果我不包含 Interval 函数,我的动作就会不断触发。任何关于如何更好地实现这一点的想法将不胜感激。

【问题讨论】:

    标签: android ontouchlistener touch-event


    【解决方案1】:

    我可以想象一个在 TouchEvent.ACTION_DOWN 上启动的计时线程,该线程将在一个休眠 500 毫秒的循环中启动并运行。在睡眠之后,它将能够执行其检查,这将执行您的自定义处理以及检查 TouchEvent.ACTION_UP 是否发生(您必须将其记录在 EventHandler 中)。

    当然需要一点同步。

    这有意义吗?

    类似这样的事情:

    boolean upHappened;
    
    switch (myTouchHandler.getAction()) {
      case (TouchEvent.ACTION_DOWN):
      upHappened = false;
      new Thread(new TimerRunnable()).start();
      case (TouchEvent.ACTION_UP):
      case (TouchEvent.ACTION_CANCEL):
      upHappened = true;
    }
    
    class TimerRunnable implements Runnable {
      public void run() {
        while(true) {
          Thread.sleep(500);
          if(upHappened) break;
          //custom processing
        }
      }
    }
    

    【讨论】:

    • +1 表示简单代码。但我会在开关中添加一个case (TouchEvent.ACTION_CANCEL):(就在另一种情况的下方,执行相同的代码)。
    • 好电话。我不记得那个案子了。它现在反映在代码中。谢谢!
    • 线程比你需要的要重得多。只需使用 Handler.sendMessageDelayed() 将要在 500 毫秒内执行的消息排入队列。
    • 这是一个很好的解决方案,非常优雅,谢谢 Nicholas。 @hackbod,sendMessageDelayed() 不会那么容易为我工作,因为我不总是希望 500ms 事件触发,只要它仍然在那个时间点保持。
    • sendMessageDelayed() 可以正常工作。当您不再希望它被触发时,只需将其删除。同样,这比每次用户触摸屏幕时创建一个新线程要轻得多。
    【解决方案2】:

    屏幕将被按下,直到你有一个带有 ACTION_UP 或 ACTION_CANCEL 动作的事件,所以我会反过来检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 2019-12-19
      相关资源
      最近更新 更多