2016-01-24 4 views
2

Я добавил звук звука в свое приложение для Android, но , когда я нажимаю слишком быстро на кнопках, звук воспроизводится только один раз (beacause, когда первая игра еще не закончена). Я хочу, чтобы звук воспроизводился при каждом нажатии.Android MediaPlayer - воспроизведение звука дважды, пока не завершено

Я хотел бы знать, что является лучшим способом реализовать поведение, которое я хочу?

Я положил на создание экземпляра MediaPlayer в методе OnCreate() и играть в OnClick()

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    [...] 
    mpClic = MediaPlayer.create(getApplicationContext(),R.raw.clic); 
} 


vButtonLeft.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     [...]    
     mpClic.start(); 
    } 
}); 
  • Я пытался остановить()/подготовить() его перед игрой() но я получаю то же самое.
  • Я попытался создать новый медиаплеер при каждом воспроизведении, он работает, но я думаю, что это не рекомендуется (и, кстати, с помощью этого метода звук в моей активности останавливается, если я спам кнопки слишком много раз очень быстро)

Спасибо заранее :)

+0

Проверьте, есть ли 'mpClic.isPlaying()' перед 'mpClic.start();' второй раз. [Документация] (http://developer.android.com/reference/android/media/MediaPlayer.html) –

+0

Хорошо, но как я могу воспроизвести его во второй раз, если он уже играет? – Maarti

ответ

0

Я нашел обходной путь, я уменьшил длину моего CLIC звука (от 0.50s до 0.17s), поэтому он заканчивает играть раньше; то я инициирую 2 экземпляра. Если мне нужно воспроизвести звук, и первый экземпляр уже играет, я играю второй.

private MediaPlayer mpClic1; 
private MediaPlayer mpClic2; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    [...] 
    mpClic1 = MediaPlayer.create(getApplicationContext(),R.raw.clic); 
    mpClic2 = MediaPlayer.create(getApplicationContext(),R.raw.clic); 
} 

vButtonRight.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      [...] 
      if(mpClic1.isPlaying()) 
       mpClic2.start(); 
      else 
       mpClic1.start(); 
     } 
    }); 

Это временное решение, так что если кто-то знает, как достичь желания эффекта переигрывая MediaPlayer, который уже играет, пожалуйста, сообщите нам, и я положил его в качестве правильного ответа. :) Спасибо.

2

пробуйте:

vButtonLeft.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

    if(mpClic.isPlaying()){ 
     mpClic.stop(); 
     mpClic.prepare(); 
    } 
     mpClic.start(); 
    } 
}); 
+0

Пробовал это, и он делает то же самое:/ – Maarti

+0

[См. Этот ответ] (http://stackoverflow.com/a/14939313/5216567) –

1

Вы можете просто воспроизводить звук с начала, если он уже воспроизводится.

vButtonLeft.setOnClickListener(new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
     if (mpClic.isPlaying()) 
     { 
      mpClic.seekTo(0); 
     } 
     else 
     { 
      mpClic.start(); 
     } 
    } 
}); 

Не совсем то, что вы хотите, но дает удовлетворительный результат в большинстве случаев.

Смежные вопросы