2016-10-20 5 views
1

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

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; 
    } 


} 

ответ

0

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

+0

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

0

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

Handler handler = new Handler(); 

И в вашем слушателе onTouch. Im not shure, если он работает с 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; 

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

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

if(x < M1right && x > M1left && y < M1bottom && y > M1top) 

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

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

Additionaly можно добавить Ий вар, который устанавливается на фас, пока звук не закончил. Только если этот var верен, начинается обработчик.

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

+0

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

+0

- ваша проблема решена? – Timo

+0

- мой азерс достаточно подробно? Или есть вопросы? – Timo