2016-10-20 1 views
1

Ich mache eine Piano-App, in der neun Tasten und wenn wir den Knopf berühren jede Taste einen anderen Klang. Aber jetzt sind die Probleme -Android-Tasten Probleme

1) wenn wir den Knopf berühren, spielt es nur den Ton dieses Knopfes und es spielte nicht den Ton der folgenden Knöpfe auf dem Bewegen der Finger.

2) Wenn ich ACTION_UP benutze, um den Ton zu stoppen, dann wird bei diesen Ereignissen, wenn wir den Finger von der Taste nehmen, der Ton gestoppt, ohne den kompletten Ton dieser Taste zu beenden.

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


} 

Antwort

0

In einem solchen Fall sollten Sie verwenden Button.Draw nicht eine Ansicht von Ihrem Selbst „9 Buttons“ und behandeln Sie das Berührungsereignis enthält.

+0

danke und können Sie mir bitte einen Link senden, der ein Beispiel enthält, in dem wir eine Ansicht zeichnen, die Schaltflächen enthält. – Rini

0

können Sie onTouch verwenden und die Musik in einem neuen Thread starten. Wenn du dich bewegst, läuft der Thread weiter. Sie können einen Handler verwenden.

Handler handler = new Handler(); 

Und in Ihrem onTouch Listener. Ich bin nicht sicher, ob es mit ACTION_DOWN funktioniert. Sie könnten auch ACTION_MOVE hinzufügen, um auch das Verschieben zu erkennen.

    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; 

Jetzt müssen Sie prüfen, ob die Touch corridates innerhalb der Taste coridnates sind. Ein Beispiel könnte sein

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) 

Dann brauchen Sie einen Faden

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

Additionaly könnten Sie eine Bool var hinzufügen, die festgelegt ist fase, bis der Ton beendet. Nur wenn diese Variable wahr ist, startet der Handler.

Hoffnung, die Ihr Problem löst. Einen schönen Tag noch!

+0

Danke für deine Ans, aber kannst du mir bitte im Detail erklären, wie kann ich ACTION_UP verwenden, um Musik in einem neuen Thread für alle Buttons zu starten? – Rini

+0

ist dein Problem gelöst? – Timo

+0

ist mein awnser detailliert genug? Oder gibt es Fragen? – Timo