Je crée une application drumpad avec huit boutons d'image qui jouent les sons en appuyant sur un bouton. J'ai essayé de comprendre comment rendre la pression sur un bouton plus réactive car le problème est que Soundpool ne lit le fichier que lorsque le bouton est relâché.

J'ai découvert qu'il existe un moyen de faire réagir le bouton au toucher en utilisant onTouchEvent, mais je ne sais pas comment l'implémenter dans mon code. J'ai essayé d'utiliser les types de fichiers .ogg et .wav pour les sons, mais ce n'est pas le problème. Je prévois également de créer des boutons qui bouclent le fichier son lorsque la touche est maintenue enfoncée, mais mon problème majeur est de savoir comment faire en sorte que tous les boutons répondent au toucher, pas au relâchement. Le code:

package com.example.user.soundboard;
import android.os.Bundle;
import android.view.View;
import android.view.MotionEvent;
import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;


public class MainActivity extends AppCompatActivity {


SoundPool mySound, mySound2, mySound3, mySound4, mySound5, mySound6, mySound7, mySound8;

int hihatId, kickId, snareId, clapId, snare2Id, hihat2Id, kick2Id, openHatId;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mySound = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    mySound2 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    mySound3 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    mySound4 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    mySound5 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    mySound6 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    mySound7 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    mySound8 = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

    hihatId = mySound.load(this, R.raw.ogghat30, 1);
    hihat2Id = mySound.load(this, R.raw.ogghihat14, 1);
    kickId = mySound.load(this, R.raw.oggkick, 1);
    kick2Id = mySound.load(this, R.raw.oggkick2, 1);
    snareId = mySound.load(this, R.raw.oggsnare8, 1);
    snare2Id = mySound.load(this, R.raw.oggsnare8, 1);
    clapId = mySound.load(this, R.raw.oggclap5, 1);
    openHatId = mySound.load(this, R.raw.ogghat24, 1);

}

public void playHihat(View view) {
    mySound.play(hihatId, 1, 1, 1, 0, 1);
}

public void playHihat2(View view) {
    mySound.play(hihat2Id, 1, 1, 1, 0, 1);
}

public void playOpenHat(View view) {
    mySound.play(openHatId, 1, 1, 1, 0, 1);
}

public void playKick(View view) {
    mySound.play(kickId, 1, 1, 1, 0, 1);
}

public void playKick2(View view) {
    mySound.play(kick2Id, 1, 1, 1, 0, 1);
}

public void playSnare(View view) {
    mySound.play(snareId, 1, 1, 1, 0, 1);
}

public void playSnare2(View view) {
    mySound.play(snare2Id, 1, 1, 1, 0, 1);
}

public void playClap(View view) {
    mySound.play(clapId, 1, 1, 1, 0, 1);
}

Pour les ImageButtons que j'utilise actuellement la méthode onClick dans la mise en page.

Merci pour l'aide!

0
808 6 avril 2017 à 14:09

2 réponses

Meilleure réponse

Vous pouvez régler onTouchEvent Listener sur votre vue afin de pouvoir jouer vos sons en réagissant aux événements touchés.

Voici un exemple:

yourButtonView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch (motionEvent.getAction()){
                case MotionEvent.ACTION_DOWN:
                    //Fired when you touch the button
                    break;

                case MotionEvent.ACTION_MOVE:
                    //Fired once you are touching button and you move your finger without release the button
                    break;

                case MotionEvent.ACTION_UP:
                    //Fired when you stop touching the button
                    break;
            }
            return true;
        }
    });
0
AlexTa 6 avril 2017 à 11:23

Au lieu de OnClickListener, vous devez utiliser OnTouchListener.

yourButton.setOnTouchListener(new OnTouchListener() {
   @Override
    public boolean onTouch(View v, MotionEvent event) {
       if(event.getAction() == MotionEvent.ACTION_UP){
           // Release sound on touch up
           return true;
       } else if(event.getAction() == MotionEvent.ACTION_DOWN){
           // Play sound
           return true;
       }
        return false;
    }
});
0
Rahul 6 avril 2017 à 11:15