наиболее эффективный способ воспроизведения звука при нажатии кнопки - PullRequest
8 голосов
/ 08 июля 2010

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

5 голосов
/ 08 июля 2010

Я думаю, это связано с тем, что вы выпустили его во время игры.Создайте глобальный 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: Для каждого запроса здесь есть аккуратная реализация, которая должна творить чудеса с вашим приложением.Я сделал это так, что вместо этого в упражнении реализован 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();
    }
}
3 голосов
/ 23 июня 2012

Если в вашем приложении будет больше кнопок, вы должны использовать SoundPool вместо MediaPlayer.Поскольку MediaPlayer испортит ваше приложение из памяти, оно не сможет воспроизводить звук.

Это помогло мне!и я думаю, вы тоже воспроизводите звук с помощью SoundPool

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...