Проблемы с кнопками Android

#android #android-mediaplayer

#Android #android-mediaplayer

Вопрос:

Я создаю приложение для фортепиано, в котором есть девять кнопок, и когда мы касаемся кнопки, каждая кнопка воспроизводит другой звук. Но теперь проблемы заключаются в-

1) когда мы касаемся кнопки, она воспроизводит звук только этой кнопки и не воспроизводит звук следующих кнопок при перемещении пальцев.

2) Если я использую ACTION_UP для остановки звука, то в этом случае, когда мы убираем палец с кнопки, это останавливает звук без завершения полного звучания этой кнопки.

    public class Piano_view extends Activity implements View.OnTouchListener {

    Button sound1, sound2, sound3, sound4, sound5, sound6, sound7, sound8,
            sound9;

    MediaPlayer mp1, mp2, mp3, mp4, mp5, mp6, mp7, mp8, mp9;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.piano_view);
        initMpFiles();
        setVolumeControlStream(AudioManager.STREAM_MUSIC);





        sound1 = (Button) findViewById(R.id.one);
        sound2 = (Button) findViewById(R.id.second);
        sound3 = (Button) findViewById(R.id.three);
        sound4 = (Button) findViewById(R.id.four);
        sound5 = (Button) findViewById(R.id.five);
        sound6 = (Button) findViewById(R.id.six);
        sound7 = (Button) findViewById(R.id.seven);
        sound8 = (Button) findViewById(R.id.eight);
        sound9 = (Button) findViewById(R.id.nine);

        sound1.setOnTouchListener(this);
        sound2.setOnTouchListener(this);
        sound3.setOnTouchListener(this);
        sound4.setOnTouchListener(this);
        sound5.setOnTouchListener(this);
        sound6.setOnTouchListener(this);
        sound7.setOnTouchListener(this);
        sound8.setOnTouchListener(this);
        sound9.setOnTouchListener(this);
    }

    private void initMpFiles() {
        mp1 = MediaPlayer.create(Piano_view.this, R.raw.a4);
        mp2 = MediaPlayer.create(Piano_view.this, R.raw.b4);
        mp3 = MediaPlayer.create(Piano_view.this, R.raw.c4);
        mp4 = MediaPlayer.create(Piano_view.this, R.raw.c5);
        mp5 = MediaPlayer.create(Piano_view.this, R.raw.e4);
        mp6 = MediaPlayer.create(Piano_view.this, R.raw.b4);
        mp7 = MediaPlayer.create(Piano_view.this, R.raw.f4);
        mp8 = MediaPlayer.create(Piano_view.this, R.raw.d4);
        mp9 = MediaPlayer.create(Piano_view.this, R.raw.g4);
    }





    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int id = v.getId();
        switch (id) {
            case R.id.one:

                float x = event.getX();
                float y = event.getY();
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp1.start();
                    mp1.seekTo(0);
                    v.setPressed(true);
                    return true;
                }

                break;
            case R.id.second:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp2.start();
                    mp2.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.three:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp3.start();
                    mp3.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.four:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp4.start();
                    mp4.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;



            case R.id.five:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp5.start();
                    mp5.seekTo(0);

                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.six:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp6.start();
                  mp6.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.seven:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp7.start();
                   mp7.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.eight:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {

                 mp8.start();
                    mp8.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.nine:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp9.start();
                    mp9.seekTo(0);
                    v.setPressed(true);
                    return true;
                }


                    break;








        }
        return true;
    }


}
  

Ответ №1:

В таком случае вам не следует использовать Button.Нарисуйте представление, содержащее «9 кнопок», и самостоятельно обработайте событие касания.

Комментарии:

1. спасибо, и не могли бы вы, пожалуйста, прислать мне ссылку, содержащую пример, в котором мы рисуем представление, содержащее кнопки.

Ответ №2:

вы можете использовать onTouch и запускать музыку в новом потоке. При перемещении поток продолжает выполняться. Вы можете использовать обработчик.

 Handler handler = new Handler();
  

И в вашем прослушивателе onTouch. Я не уверен, работает ли он с ACTION_DOWN. Вы также могли бы добавить ACTION_MOVE, чтобы также обнаруживать перемещение.

                     int x = (int) motionEvent.getRawX() - coords[0];
                    int y = (int) motionEvent.getRawY() - coords[1];
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN || event.getAction() == android.view.MotionEvent.ACTION_MOVE) {
                    if(put your test with the coodinates here){
                        handler.post(runMp1);
                        return true;
                    }
                }

            break;
  

Теперь вам нужно проверить, находятся ли сенсорные коридоры в пределах коридоров кнопок. Примером может быть

  int M1right = (int) button.getRight();
 int M1top = (int) button.getTop();
 int M1left = (int) button.getLeft();
 int M1bottom = (int) button.getBottom();

 if(x < M1right amp;amp; x > M1left amp;amp; y < M1bottom amp;amp; y > M1top)
  

Тогда вам нужна ниточка

 private Runnable runMp1 = new Runnable() {
    @Override
    public void run() {
        mp1.start();
        mp1.seekTo(0);
        v.setPressed(true);
    }
};
  

Дополнительно вы могли бы добавить переменную bool, которая установлена в фазу до тех пор, пока звук не закончится. Только если этот параметр имеет значение true, обработчик запускается.

Надеюсь, это решит вашу проблему. Хорошего дня!

Комментарии:

1. Спасибо за ваш ответ, но не могли бы вы, пожалуйста, подробно объяснить мне, как я могу использовать ACTION_UP для запуска музыки в новом потоке для всех кнопок

2. достаточно ли подробно описан мой awnser? Или есть какие-либо вопросы?