Wiedergabe einen Looping-Sounds, wenn die Taste gedrückt wird in Android
-
29-09-2019 - |
Frage
mein Problem ist einfach. Ich möchte nur einen Looping Sound spielen, wenn eine Taste gedrückt wird. Im Folgenden sind die switch-Anweisung und wenn sonst Ansätze, die ich ausprobiert habe. am besten, ich den Ton spielen kann, aber es wird nicht anhalten, wenn die Taste nicht mehr gedrückt wird.
public boolean onTouch(View v, MotionEvent event) {
MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.clash);
if (v.getId() == R.id.clash && event.getAction() == MotionEvent.ACTION_DOWN){
mp.setLooping(true);
mp.start();
}else if (v.getId() == R.id.clash && event.getAction() == MotionEvent.ACTION_UP)
{mp.pause();
}
}
public boolean onTouch(View v, MotionEvent event) {
MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.clash);
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
mp.setLooping(true);
mp.start();
case MotionEvent.ACTION_UP:
mp.pause();
}
return false;
}
Lösung
Versuchen true
statt false
am Ende onTouch
zurück.
Was ist (wahrscheinlich) passiert ist, gerade jetzt, dass Sie ein ACTION_DOWN
Ereignis erhalten, die Ihren Sound beginnt. Durch die Rückgabe false
sagen Sie den Rahmen, dass Sie hat nicht verbrauchen die Aktion, die es zu verstehen, nimmt, dass Sie zukünftige Aktionen nicht verbrauchen, auch nicht. So wird es Berührungsereignisse zu Ihrer Ansicht aufhören zu senden.
Relevante Zitat von android-Entwickler :
Wenn Sie das ACTION_DOWN Ereignis bekommen, kehren Sie wahr? Wenn nicht, diese ist wahrscheinlich das Problem. Der Rahmen wird nur zukünftige Touch-Ereignisse liefern (ACTION_MOVEs und die ACTION_UP) zu dass Ansicht, wenn seine Berührung Hörer oder onTouchEvent gibt true zurück.
Andere Tipps
Bewegen Sie mp außerhalb des OnTouch Handler!
MediaPlayer mp;
public boolean onTouch(View v, MotionEvent event) {
mp = MediaPlayer.create(getBaseContext(), R.raw.clash);
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
mp.setLooping(true);
mp.start();
case MotionEvent.ACTION_UP:
mp.pause();
}