2010-07-08 5 views
8

Im Moment habe ich zwei Tasten. Jeder muss einen anderen Klang erzeugen. In der Zukunft wird es wahrscheinlich ungefähr 8 Knöpfe geben, aber im Moment nur zwei.effizienteste Weise, einen Ton zu spielen, wenn Knopf geklickt wird

public class MyActivity extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      final Button btnDrum1 = (Button) findViewById(R.id.btnDrum1); 
      btnDrum1.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        MediaPlayer mp = MediaPlayer.create(this, R.raw.drum1); 
         mp.start(); 
         mp.release(); 
       } 
      }); 

      final Button btnCym1 = (Button) findViewById(R.id.btnCym1); 
      btnCym1.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        MediaPlayer mp = MediaPlayer.create(this, R.raw.cym1); 
          mp.start(); 
          mp.release(); 
       } 
      }); 

     } 
    } 

Ursprünglich habe ich nicht mp.release() und es würde den Ton richtig, aber schließlich die App spielen würde abstürzen aufgrund der Speicher ausgeht. Jetzt mit dem mp.release() stürzt es nicht ab, aber manchmal spielt es den Ton nicht, wenn er geklickt wird.

Ist dies die effizienteste Art, einen Sound zu spielen, wenn auf die Schaltfläche geklickt wird? Ist es erweiterbar?

Antwort

5

Ich denke, das liegt daran, dass Sie es loslassen, während es spielt. Erstelle einen globalen MediaPlayer für jeden Sound und benutze ihn immer wieder, lasse ihn los, wenn die Aktivität geschlossen ist (vielleicht sogar wenn er pausiert ist, und lade ihn erneut, wenn die Sounddateien groß sind). Auch, weil Sie viele Knöpfe haben, können Sie eine einzelne OnClickListener auf alle Tasten, die Sie auf onCreate instanziiert():

private class MyMagicalOnClickListener implements View.OnClickListener { 
    @Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
      case R.id.button1: 
      //play sound 1 
      break; 
     case R.id.button2: 
      //play sound 2 
      break; 
     } 
    } 
} 

nur mir einen Kommentar und sagen Sie, wenn Sie sich nicht sicher sind, wie Sie diese implementieren :)

bearbeiten: Pro Anfrage, hier ist eine nette Umsetzung, die mit Ihrer App Wunder wirken sollte. Ich habe es so gemacht, dass die Aktivität onclicklistener implementiert, ich denke, es ist ein bisschen sauberer.

public class Bluarg extends Activity implements OnClickListener{ 

    MediaPlayer mp1; 
    MediaPlayer mp2; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mp1 = MediaPlayer.create(this, R.raw.sound1); 
     mp2 = MediaPlayer.create(this, R.raw.sound2); 

     final Button button1 = (Button) findViewById(R.id.button1); 
     button1.setOnClickListener(this); 

     final Button button2 = (Button) findViewById(R.id.button2); 
     button1.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
     case R.id.button1: 
      mp1.start(); 
      break; 
     case R.id.button2: 
      mp2.start(); 
      break; 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     mp1.release(); 
     mp2.release(); 
     super.onDestroy(); 
    } 
} 
+0

Was du beschreibst scheint sinnvoll zu sein, aber ich bin ein wenig unsicher über die beste Möglichkeit, das zu implementieren. – Bromide

+0

dort habe ich in einer Implementierung bearbeitet. Vergewissere dich einfach, was ich getan habe, damit du es auch in anderen Situationen verwenden kannst :) – pgsandstrom

3

Wenn Ihre App mehr Schaltflächen hat, sollten Sie SoundPool anstelle von MediaPlayer verwenden. Da der MediaPlayer Ihre App aus dem Speicher ruiniert, kann er keinen Ton mehr abspielen.

Das ist mir geholfen! und ich denke, du wirst auch Play sound with SoundPool

Verwandte Themen