2017-04-06 15 views
0

私はボタンプレスで音を再生する8つの画像ボタンを備えたドラックパッドアプリを製作しています。私は、ボタンが押されたときにだけSoundpoolがファイルを再生するという問題があるので、ボタンのプレスをより敏感にする方法を見つけようとしています。Android Soundpool - タッチイベント

ボタンをonTouchEventを使って触れるようにする方法があることがわかりましたが、私のコードにその方法を実装する方法はわかりません。私は両方の.oggと.wavファイルタイプをサウンドに使用しようとしましたが、それは問題ではありません。私はまた、キーが押されているときにサウンドファイルをループするボタンを作成するつもりですが、私の主な問題は、すべてのボタンをタッチするのではなく、リリースする方法です。コード:

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

ImageButtonについては、私は現在LayoutでonClickメソッドを使用しています。

ありがとうございました!

答えて

0

あなたのビューにonTouchEvenListenerを設定すると、そのタッチイベントに反応するサウンドを再生できます。

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

ありがとう:ここ

あなたは例を持っています!魅力的な作品!しかし、私は、ボタン・プレスでボタン・イメージがそれ以上変わらないという新しい問題に直面しました。以前は、アンドロイド:src = "@ drawable/changecolorsnare"をレイアウトに使用する前に、サウンドを再生するために実装した新しいonTouchコードを使用しない他のボタンでも使用できるボタンイメージを変更するonTouchを作成しました。同じボタンのためにonTouchとImageViewのonTouchの両方を使用すると、アプリケーションがクラッシュします。サウンドの新しいコードを変更せずに、それらを組み合わせたり、別の方法で行う方法はありますか?Image button BTWを使用しています。 – 808

0

OnClickListenerの代わりに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; 
    } 
});