2017-04-06 3 views
0

나는 버튼 누름시 사운드를 재생하는 8 개의 이미지 버튼이있는 drumpad 앱을 만들고 있습니다. 문제가 버튼을 놓을 때만 Soundpool이 파일을 재생한다는 점에서 나는 버튼을 더 쉽게 누르는 방법을 알아 내려고 노력해 왔습니다.Android Soundpool - 터치 이벤트

버튼을 onTouchEvent를 사용하여 만지게하는 방법이 있다는 것을 알았지 만,이를 내 코드에 구현하는 방법을 알지 못합니다. 나는 사운드에 .ogg와 .wav 파일 유형을 모두 사용하려고 시도했지만 그게 문제가 아닙니다. 또한 키를 누르고있을 때 사운드 파일을 반복하는 버튼을 만들려고 계획하고 있지만 중요한 문제는 모든 버튼을 터치하지 않고 해제하는 방법입니다. 코드 : 나는 현재 레이아웃에 온 클릭 방법을 사용하고있어 ImageButtons를 들어

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

.

도움 주셔서 감사합니다.

답변

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와 ImageView 용 onTouch가 모두있는 경우 응용 프로그램이 충돌합니다. 소리를 새 코드로 변경하지 않고 다른 방법으로 결합하거나 다른 방법으로 사용할 수 있습니까? 이미지 버튼 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; 
    } 
});