2017-04-06 105 views
0

我正在製作一個帶有八個按鈕的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方法。

感謝您的幫助!

回答

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

謝謝!奇蹟般有效!不過,我遇到了一個新問題,即按鈕按下時按鈕圖像不再發生變化。之前我在佈局中使用了「android:src =」@ drawable/changecolorsnare「。現在,我嘗試創建onTouch來更改按鈕圖像,該按鈕圖像適用於其他按鈕,該按鈕不使用用於播放聲音的新的onTouch代碼。如果我的onTouch聲音和onTouch for ImageView功能同一個按鈕,應用程序會崩潰。有沒有一種方法可以將它們結合起來或以另一種方式進行,而無需更改聲音的新代碼?我正在使用圖像按鈕。 – 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; 
    } 
});