마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

onTouchListener시 지속적인 이벤트 발생 방법

0 추천

buzzer버튼을 생성 후 

이 버튼을 누르고 있으면 계속 이벤트가 발생(소리가 지속되는)하는 방법이 궁금합니다

 

현재 ACTION_DOWN을 이용해서 코드를 만들어봤는데

누르고 있어도 OnClick처럼 한번만 소리가 나더라구요

그래서 while(true)를 사용해 봤는데 실패했습니다.

 

다른방법으로 ACTION_MOVE를 이용하니 되긴하는데

잡음이 많이 들리고(소리가 깨끗하지못함) , 버튼을 벗어나도 소리가가 지속되더라구요

 

방법 좀 알려주세요 ㅠㅠ

 

*코드*  (res에 raw라는 파일을 생성하고 음악파일을 넣어야 실행이 됩니다.)

MainActivity.java

 

package com.example.touch;
 
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
 
 
public class MainActivity extends ActionBarActivity {
 
private SoundPool sound_pool;
 private int sound_correct;
 private OnTouchListener mTouchListener=null;
 
 
 public void sound(){
  
  sound_pool.play(sound_correct, 1.0f, 1.0f, 0, 0, 1.0f);
  
  }
 
 
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     
     sound_pool = new  SoundPool(5, AudioManager.STREAM_MUSIC, 0);
 sound_correct = sound_pool.load(getBaseContext(), R.raw.buzzer, 1);
 
 Button buzzer = (Button)findViewById(R.id.buzzer);
 
buzzer.setOnTouchListener(new View.OnTouchListener() {
 
 
@Override
public boolean onTouch(View v, MotionEvent event) {
 
 
if(event.getAction()==MotionEvent.ACTION_DOWN){
 
 
sound();
 
       if(event.getAction()==MotionEvent.ACTION_UP){
                       
              }
}
 
return true;}
     });
 
 }}
 
 
 
activity_main.xml
 
 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.touch.MainActivity" >
 
    <Button
                android:id="@+id/buzzer"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical|center_horizontal"
                android:text="Buzzer" />
 
</RelativeLayout>
 

 

이주훈 (270 포인트) 님이 2014년 8월 11일 질문

2개의 답변

+1 추천

 SoundPool을 무한루프로 설정해놓고

ACTION_DOWN에 play시키고

ACTION_UP에 stop시켜보세요

alkyne (22,960 포인트) 님이 2014년 8월 11일 답변
public void sound_play(){
                    
          while(true){
           sound_pool.play(sound_correct, 1.0f, 1.0f, 0, 0, 1.0f);
           
      }
           }
                 
      public void sound_stop(){
           
           sound_pool.stop(sound_correct);
           
       }

@Override
                    public boolean onTouch(View v, MotionEvent event) {
                       
                    if(event.getAction()==MotionEvent.ACTION_DOWN){
                               
                        sound_play();
                               
                        if(event.getAction()==MotionEvent.ACTION_UP){
                               
                                    sound_stop();
                                   
                                   
                                       }
                               
                               
                        }
                                       
                       
               
                return true;
                    }
              });

말씀하신대로
play랑 stop메소드 만들고 soundpool 무한루프로 설정해놓고 해보았는데

여전히 안되네요
( 버튼 누르면 소리도 안나면서 무한루프 돌고
버튼을 떼어도 멈추지 않고 무한루프 계속 돌다가
 프로그램이 멈춰버리네요)
while문으로 루프를 도는것이 아니라 사운드풀에 루프횟수 설정하는 메서드를 찾아보세요
@Override
        public boolean onTouch(View v, MotionEvent event) {
                       
                    if(event.getAction()==MotionEvent.ACTION_DOWN){
                               
             sound_pool.play(sound_correct, 1.0f, 1.0f, 0, -1, 1.0f);
                    }   
                         else if(event.getAction()==MotionEvent.ACTION_UP){
                               
                            sound_pool.stop(sound_correct);
                           
                           
                                       }
                               
                               
                       
                                       
                       
               
                return true;
                    }
              });

답변 감사드려요 !!

근데 while로 안하고 루프횟수 -1로 설정해서 무한루프 돌게 했는데

버튼을 떼어도 무한루프가 멈추질 않네여 ㅠㅠ

ㅠㅠ 죄송합니다 좀만 상세히 알려주세요
stop할때는 load()가 반환한 soundId가 아닌
play()가 반환한 streamId를 넣어야돼요

case MotionEvent.ACTION_DOWN:
        streamId = sound.play(soundId, 1, 1, 0, -1, 1);
        break;
 case MotionEvent.ACTION_UP:
        sound.stop(streamId);
답변이 늦어 죄송합니다..

alkyne님 덕분에 문제가 금방 해결되었습니다~ 정말정말 감사드려요 ^^
+1 추천
버튼이라면 isPressed 라고 상태를 확인하는 함수가 있어서

isPressed == true 일 때 소리가 나도록 하시면 될거같네요

구현방법이야 다양하니 글쓴님이 한번 생각해보세요~
초보개발자ㅠ (33,870 포인트) 님이 2014년 8월 12일 답변
...