Добавьте событие onTouch для Action_Down и _up к кнопке во время выполнения, чтобы воспроизводить звук при нажатии кнопки.

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

Просматривая веб-страницы и переполняя стек, я придумал этот код:

    // Create a new button and place it into a table row
    LinearLayout lnr = (LinearLayout) findViewById(R.id.tableRow3);
    Button b1 = new Button(this);
    lnr.addView(b1);

    // Associate the event
    b1.setOnTouchListener(new OnTouchListener() {
        MediaPlayer mp = new MediaPlayer();
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                // Finger started pressing --> play sound in loop mode
                try {
                    FileInputStream fileInputStream = new FileInputStream( PATH );
                    mp.setDataSource(fileInputStream.getFD());
                    mp.prepare();
                    mp.setLooping(true);
                    mp.start();
                } catch (Exception e) {}
            case MotionEvent.ACTION_UP:
                // Finger released --> stop playback
                try {
                    mp.stop();
                } catch (Exception e) {} 
          }
          return true;
        }
      });   

Проблема в том, что я вообще не слышу звука. Мне кажется, что case MotionEvent.ACTION_UP: срабатывает напрямую. Поэтому воспроизведение сразу останавливается.

Чтобы проверить эту гипотезу, я удалил mp.stop(); и услышал бесконечный цикл звука. Однако совершенно ясно, что это должно быть событие ACTION_UP, которое все испортило. Но как может сработать событие ACTION_UP, если я не отпущу палец/мышь?


person Bernd    schedule 07.04.2013    source источник


Ответы (2)


Вы должны вставить «break» внизу «case MotionEvent.ACTION_DOWN».

person Takahiko Kawasaki    schedule 07.04.2013
comment
Конечно... Я был так озабочен поиском проблемы с объектом MediaPlayer или MotionEvent, что пропустил очевидное. Благодарю вас! Я исправил код и прикрепил его ниже. - person Bernd; 08.04.2013
comment
Я только что понял, что это работает только один раз. Я нажимаю кнопку и слышу звуковую петлю. Я отпускаю кнопку, и воспроизведение сразу останавливается. Также необходимо добавить mp.reset(); после mp.stop(); - person Bernd; 08.04.2013

Правильный код:

    // Create a new button and place it into a table row
    LinearLayout lnr = (LinearLayout) findViewById(R.id.tableRow3);
    Button b1 = new Button(this);
    lnr.addView(b1);

    // Associate the event
    b1.setOnTouchListener(new OnTouchListener() {
        MediaPlayer mp = new MediaPlayer();
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                // Finger started pressing --> play sound in loop mode
                try {
                    FileInputStream fileInputStream = new FileInputStream( PATH );
                    mp.setDataSource(fileInputStream.getFD());
                    mp.prepare();
                    mp.setLooping(true);
                    mp.start();
                } catch (Exception e) {}
            break;
            case MotionEvent.ACTION_UP:
                // Finger released --> stop playback
                try {
                    mp.stop();
                    mp.reset();
                } catch (Exception e) {}
            break;
          }
          return true;
        }
      });
person Bernd    schedule 08.04.2013