【问题标题】:onTouchEvent() of Activity fires 3 times?Activity 的 onTouchEvent() 触发 3 次?
【发布时间】:2012-08-09 13:50:18
【问题描述】:

在我的 TitleScreen 活动中,我有...

@Override
public boolean onTouchEvent(MotionEvent event)
{
   Log.d("MyActivity", "in onTouchEvent!");

   MediaPlayer myplayer = MediaPlayer.create(TitleScreen.this, R.raw.mysound);
   myplayer.start();
   startActivity(new Intent("com.example.GAME"));
   return super.onTouchEvent(event);
}

这导致声音在点击屏幕时快速连续播放 3 次,使我想播放的声音有延迟回声。我检查了日志,以及我的“in onTouchEvent!”消息被记录了 3 次。

这个活动只是标题屏幕的静态图像,想法是你点击它开始下一个活动,当你这样做时,指定的声音应该播放。

对于我的特定问题,我可以通过放置一个全局级别的 int 变量来解决它:

private static int playerInstances = 0;

然后将我的 MediaPlayer 行包装为:

if (playerInstances == 0)
{
    MediaPlayer myplayer = MediaPlayer.create(TitleScreen.this, R.raw.critical1);
    myplayer.start();
    playerInstances++;
}

这保证了该代码只执行一次。所以我的问题解决了。我只是想知道为什么我一键获得了 3 次 onTouchEvent。

【问题讨论】:

  • 我认为这是因为所有三个触摸事件(ACTION_DOWN、ACTION_UP、ACTION_MOVE)都被调用了。看看这个链接stackoverflow.com/questions/11777459/…
  • 哈,太棒了!你应该把它作为答案,这样我就可以给你信用。
  • 嗯......很高兴它有帮助......你可以投票赞成;)

标签: android android-activity android-mediaplayer touch-event


【解决方案1】:

您实际上可以在 onTouchEvent 上做的事情(比使用静态变量更好)是:

@Override
public boolean onTouchEvent(MotionEvent event) {
   final int action = event.getAction();

   if(action == MotionEvent.ACTION_DOWN) {
       Log.d("MyActivity", "in onTouchEvent!");
       MediaPlayer myPlayer = MediaPlayer.create(TitleScreen.this, R.raw.mysound);
       myPlayer.start();
       startActivity(new Intent("com.example.GAME"));
   }
   return super.onTouchEvent(event);
}

【讨论】:

    【解决方案2】:

    发生这种情况是因为 onTouchevent() 具有在您触摸屏幕时调用的三个事件,即 ACTION_DOWN、ACTION_MOVE、ACTION_UP。因此,如果您不单独为这些事件应用条件,那么 onTouchEvent() 中的代码将被调用 3 次。因此请确保将代码写入适当的操作事件中。

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2016-12-12
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      相关资源
      最近更新 更多