单击按钮时播放声音的最有效方法

时间:2010-07-08 13:12:45

标签: android button audio

现在我有两个按钮。每个人都需要产生不同的声音。在未来,可能会有大约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()它不会崩溃,但有时它在点击时不会播放声音。

单击按钮时,这是播放声音最有效的方法吗?它是可扩展的吗?

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:3)

如果您的应用有更多按钮,则应使用SoundPool而不是MediaPlayer。因为MediaPlayer会破坏你的应用程序的内存,所以它不再播放声音了。

这对我有所帮助!而且我想你也会 Play sound with SoundPool