2010-07-08 131 views
8

現在我有兩個按鈕。每個人都需要產生不同的聲音。未來,可能會有大約8個按鈕,但現在只有兩個按鈕。單擊按鈕時播放聲音的最有效方式

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(); 
       } 
      }); 

     } 
    } 

最初我沒有mp.release(),它會正常播放聲音,但最終應用程序會因內存不足而崩潰。現在使用mp.release()它不會崩潰,但有時點擊時它不會播放聲音。

這是點擊按鈕時播放聲音的最有效方式嗎?它是可擴展的嗎?

回答

5

我認爲這是由於你在播放時釋放它。爲每個聲音製作一個全球MediaPlayer,然後重複使用它,在活動關閉時釋放(甚至可能在暫停時釋放,如果聲音文件很大,則在恢復時重新加載)。此外,由於你將有許多按鈕,你可以對你實例化的onCreate()所有按鈕的單個onclicklistener:

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; 
     } 
    } 
} 

只是發表意見,並告訴我,如果你是如何實現這一:)

不確定

編輯:每個請求,這裏是一個整潔的實現應該與您的應用程序奇蹟。我做到了,所以這個活動實現onclicklistener,我認爲它更清潔一點。

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

你所描述的似乎有意義,但我有點不確定實現它的最佳方式。那裏有我編輯的 – Bromide 2010-07-08 14:48:30

+0

。只要確保瞭解我所做的事情,以便您可以在其他情況下使用此:) – pgsandstrom 2010-07-09 09:19:46

3

如果您的應用程序將具有更多按鈕,則應該使用SoundPool而不是MediaPlayer。由於MediaPlayer會毀掉你的應用程序,所以它不能播放聲音了。

這幫了我一個忙!我想你也會這樣 Play sound with SoundPool

相關問題