Android Soundpool - 触摸事件

问题描述:

我正在制作一个带有八个按钮的drumpad应用程序,可以在按钮按下时播放声音。我一直在试图弄清楚如何使按钮的响应更加灵敏,因为问题在于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); 
} 

对于ImageButtons我目前在布局中使用onClick方法。

感谢您的帮助!

您可以将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

谢谢!奇迹般有效!不过,我遇到了一个新问题,即按钮按下时按钮图像不再发生变化。之前我在布局中使用了“android:src =”@ drawable/changecolorsnare“。现在,我尝试创建onTouch来更改按钮图像,该按钮图像适用于其他按钮,该按钮不使用用于播放声音的新的onTouch代码。如果我的onTouch声音和onTouch for ImageView功能同一个按钮,应用程序会崩溃。有没有一种方法可以将它们结合起来或以另一种方式进行,而无需更改声音的新代码?我正在使用图像按钮。 – 808

而不是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; 
    } 
});