Вызов SoundPool Thead onClickEvent

Я пытаюсь воспроизвести SoundPool, пока щелкают объект просмотра.

Я успешно реализовал это, но обнаружил, что звук щелчка будет отставать.

Я искал решения в StackOverFlow и в Интернете, и, похоже, лучшим решением было бы иметь SoundPool в отдельном потоке.

Я очень новичок во всей этой теме, поэтому я действительно не знаю, что делать в данный момент.

Я следовал ЭТОМУ руководству по созданию потока SoundPool, однако я не знаю, как получить к нему доступ или даже назначить клипы, которые я хотел воспроизвести.

Может кто-нибудь, пожалуйста, дайте мне пример того, как я должен вызвать поток SoundPool для воспроизведения моего клипа, когда нажимается объект в представлении.

Пожалуйста, найдите мой код onClick ниже:

@Override
public boolean onTouch(View v, MotionEvent event) {
    int actionPerformed = event.getAction();

    switch(actionPerformed) {
        case MotionEvent.ACTION_DOWN: {
            if (Math.pow((event.getX() - a_Ball.getX()),2)
                + Math.pow((event.getY() - a_Ball.getY()), 2)
                <= Math.pow(a_Ball.getDiameter(),2)) {
                //pCheck = !pCheck;
                if (pauseBall == false) {
                    SoundPool soundPool = new SoundPool(1,AudioManager.STREAM_MUSIC,1);
                    clickSound = soundPool.load(MainActivity.this, R.raw.click, 1);
                    /*soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                        public void onLoadComplete(SoundPool soundPool, int sampleId,int status) {
                            soundPool.play(clickSound,1.0f, 1.0f, 0, 0, 1.0f);
                            }
                    });*/


                    //Increase Ball Speed
                    sIncrease = true;
                }
            } else {
                if (pauseBall == false) {
                    //set minus health when not touch on ball
                    health--;
                    TextView txtHealth = (TextView)findViewById(R.id.health);
                    String tempHealth = txtHealth.getText().toString();
                    tempHealth =  getResources().getString(R.string.health) + String.valueOf(health);
                    txtHealth.setText(tempHealth);
                }
            }
            break;
        }
        default:
            return false;
    }
    return true;
}   //onTouch end

Заранее спасибо.


person fireboy0526    schedule 30.04.2014    source источник


Ответы (2)


Вам не нужны потоки, чтобы издавать звуки без задержек. Задержка возникает из-за загрузки звукового файла, попробуйте создать SoundPool и загрузить звук (soundPool.load) заранее (например, onCreate), затем просто вызовите soundPool.play в методе onTouch.

person Nicolas Defranoux    schedule 30.04.2014
comment
Спасибо за ваш ответ николас. Я переместил создание и загрузку soundPool в свой раздел onCreate и вызвал свой метод, однако он все еще имеет отставание .... единственное временное решение, которое я использую, - это постоянное зацикливание при отключении звука. Я постараюсь посмотреть, есть ли какое-либо другое решение. Еще раз спасибо за ответ - person fireboy0526; 30.04.2014
comment
Странно, я использую метод SoundPool.play в слушателе onTouch без каких-либо задержек. У меня есть 0 в качестве последнего параметра для конструктора SoundPool, хотя в документации говорится, что это не имеет никакого эффекта. Я также настраиваю свой SoundPool на параллельное воспроизведение нескольких звуков (первый параметр установлен на 6), так как я воспроизвожу несколько звуков. Это также помогает, когда один звук не закончен, а начинается следующий. - person Nicolas Defranoux; 01.05.2014
comment
Я вижу, это очень хорошая информация. Я обязательно попробую. Но у некоторых людей, кажется, та же проблема, что и у меня, и, поместив это в поток, кажется, что проблема решается идеально (на данный момент). Я проведу дополнительное расследование. Еще раз большое спасибо за вашу помощь - person fireboy0526; 01.05.2014

Итак, вместо того, чтобы делать это в другом классе, я решил сделать это в одном классе и сам создал новый поток. Кажется, работает достаточно хорошо.

Я отмечу эту тему как ответ.

person fireboy0526    schedule 30.04.2014