2010-07-08 27 views
8

Ngay bây giờ tôi có hai nút. Mỗi người cần tạo ra một âm thanh khác nhau. Trong tương lai, có thể sẽ có khoảng 8 nút, nhưng bây giờ chỉ có hai.cách hiệu quả nhất để phát âm thanh khi nút được nhấp vào

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

     } 
    } 

Ban đầu tôi không có mp.release() và nó sẽ phát âm thanh đúng cách, nhưng cuối cùng ứng dụng sẽ gặp sự cố do hết bộ nhớ. Bây giờ với mp.release() nó không sụp đổ, nhưng đôi khi nó không phát âm thanh khi được nhấp.

Đây có phải là cách hiệu quả nhất để phát âm thanh khi nút được nhấp không? Nó có mở rộng được không?

Trả lời

5

Tôi nghĩ điều này là do bạn phát hành nó khi đang phát. Tạo một MediaPlayer toàn cầu cho mỗi âm thanh và sử dụng nó lặp đi lặp lại, phát hành khi hoạt động được đóng lại (có thể ngay cả khi nó bị tạm dừng và tải lại khi tiếp tục nếu các tệp âm thanh lớn). Ngoài ra, vì bạn sẽ có nhiều nút, bạn có thể có một OnClickListener duy nhất trên tất cả các nút mà bạn nhanh chóng trên onCreate():

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

chỉ nhận xét và cho tôi biết nếu bạn không chắc chắn về cách thực hiện điều này :)

chỉnh sửa: Theo yêu cầu, đây là một cách triển khai gọn gàng nên làm việc kỳ diệu với ứng dụng của bạn. Tôi đã làm cho nó để các hoạt động thực hiện onclicklistener thay vào đó, tôi nghĩ rằng nó là một chút sạch sẽ hơn.

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

Điều bạn mô tả có vẻ hợp lý, nhưng tôi không chắc chắn cách tốt nhất để thực hiện điều đó. – Bromide

+0

ở đó, tôi đã chỉnh sửa trong quá trình triển khai. Chỉ cần chắc chắn để hiểu những gì tôi đã làm để bạn có thể sử dụng điều này trong các tình huống khác :) – pgsandstrom

3

Nếu ứng dụng của bạn sẽ có nhiều nút hơn, bạn nên sử dụng SoundPool thay vì MediaPlayer. Bởi vì MediaPlayer sẽ làm hỏng ứng dụng của bạn ra khỏi bộ nhớ sau đó nó không thể chơi âm thanh nữa.

Điều này đã giúp tôi! và tôi nghĩ bạn cũng sẽ quá Play sound with SoundPool

Các vấn đề liên quan