самый эффективный способ играть звук, когда кнопка нажата

Прямо сейчас у меня есть две кнопки. Каждый должен произвести различный звук. В будущем вероятно, будет приблизительно 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 () это не отказывает, но иногда это не играет звук при нажатии.

Действительно ли это - большая часть efficeient способа играть звук, когда кнопка нажата? Действительно ли это расширяемо?

8
задан pgsandstrom 18 April 2013 в 06:59
поделиться

1 ответ

Я думаю, это связано с тем, что вы выпустили его во время воспроизведения. Создайте глобальный MediaPlayer для каждого звука и используйте его снова и снова, отпустите, когда действие будет закрыто (возможно, даже когда оно приостановлено, и перезагрузите при возобновлении, если звуковые файлы большие). Кроме того, поскольку у вас будет много кнопок, у вас может быть один onclicklistener для всех кнопок, которые вы создаете в 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;
        }
    }
}

просто прокомментируйте и сообщите мне, если вы не уверены, как это реализовать:)

edit: По запросу, вот изящная реализация, которая должна творить чудеса с вашим приложением. Я сделал так, чтобы вместо этого Activity реализовал 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();
    }
}
5
ответ дан 5 December 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: