3

在我的 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++;
}

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

4

2 回答 2

11

您实际上可以做的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);
}
于 2012-08-09T14:48:49.880 回答
3

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

于 2017-05-09T11:15:04.580 回答