2010-07-08 3 views
8

지금은 두 개의 버튼이 있습니다. 각자 다른 소리를 만들어야합니다. 앞으로 8 개의 버튼이있을 것입니다.하지만 현재는 2 개입니다.버튼을 클릭 할 때 가장 효율적인 사운드 재생 방법

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를 만들고 반복해서 사용하고, 활동이 닫힐 때 해제합니다 (일시 중지 된 경우에도 해제하고 사운드 파일이 클 경우 다시 시작합니다). 방금 언급 당신이 :)

을 구현하는 방법에 대한 확신이 있다면 말해

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

을 : 당신이 많은 버튼이 것 때문에, 당신은 당신이에서 onCreate()에서 인스턴스화 모든 버튼에 하나의 OnClickListener를을 가질 수

편집 : 요청에 따라 여기 앱에 이상하게 작동해야하는 깔끔한 구현이 있습니다. 나는 활동을 통해 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

+0

거기에, 나는 구현에서 편집. 당신이 다른 상황에서도 이것을 사용할 수 있도록 내가 한 것을 이해하도록하십시오 :) – pgsandstrom

3

앱에 더 많은 버튼이있는 경우 MediaPlayer 대신 SoundPool을 사용해야합니다. MediaPlayer가 메모리 부족으로 앱을 망칠 것이므로 더 이상 사운드를 재생할 수 없습니다.

이것은 나를 도와줍니다! 나는 너도 그렇게 생각한다. Play sound with SoundPool

관련 문제