2014-04-30 4 views
1

뷰 객체를 클릭하는 동안 SoundPool을 재생하려고합니다.SoundPool Thead onClick 이벤트 호출

성공적으로 구현했지만 클릭 소리가 지연되는 것으로 나타났습니다.

저는 StackOverFlow와 인터넷에서 솔루션을 연구하고 있으며 최고의 솔루션은 별도의 스레드에 SoundPool을 가지고있는 것으로 보입니다.

나는 전체 스레드에 매우 익숙하므로 지금은 무엇을 해야할지 잘 모릅니다.

나는 SoundPool 스레드를 만드는 데있어 THIS 가이드를 따라 왔지만, 어떻게 접근할지, 심지어 내가하고 싶었던 클립을 할당 할지도 모른다.

누군가가보기의 개체를 클릭하는 동안 SoundPool 스레드에서 내 클립을 재생하는 방법을 보여줄 수 있습니까? 사전에

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    int actionPerformed = event.getAction(); 

    switch(actionPerformed) { 
     case MotionEvent.ACTION_DOWN: { 
      if (Math.pow((event.getX() - a_Ball.getX()),2) 
       + Math.pow((event.getY() - a_Ball.getY()), 2) 
       <= Math.pow(a_Ball.getDiameter(),2)) { 
       //pCheck = !pCheck; 
       if (pauseBall == false) { 
        SoundPool soundPool = new SoundPool(1,AudioManager.STREAM_MUSIC,1); 
        clickSound = soundPool.load(MainActivity.this, R.raw.click, 1); 
        /*soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
         public void onLoadComplete(SoundPool soundPool, int sampleId,int status) { 
          soundPool.play(clickSound,1.0f, 1.0f, 0, 0, 1.0f); 
          } 
        });*/ 


        //Increase Ball Speed 
        sIncrease = true; 
       } 
      } else { 
       if (pauseBall == false) { 
        //set minus health when not touch on ball 
        health--; 
        TextView txtHealth = (TextView)findViewById(R.id.health); 
        String tempHealth = txtHealth.getText().toString(); 
        tempHealth = getResources().getString(R.string.health) + String.valueOf(health); 
        txtHealth.setText(tempHealth); 
       } 
      } 
      break; 
     } 
     default: 
      return false; 
    } 
    return true; 
} //onTouch end 

감사 :

아래에있는 내 온 클릭 코드를 찾아주세요.

답변

0

지연없이 소리를 내기 위해 스레드가 필요하지 않습니다. 사운드 파일을로드 할 때 지연이 발생합니다. SoundPool을 생성하고 (soundPool.load) 미리 소리 (예 : onCreate)를로드 한 다음 onTouch 메소드에서 soundPool.play으로 전화하면됩니다.

+0

답변 해 주셔서 감사합니다. soundPool의 생성 및로드를 onCreate 섹션으로 옮기고 내 메서드에서 호출하지만, 여전히 지연이 있습니다. 사용하고있는 유일한 임시 솔루션은 계속 음소거를 반복하는 것입니다. 나는 다른 해결책이 있는지보기 위해 노력할 것이다. 귀하의 회신을 다시 보내 주셔서 감사합니다 – fireboy0526

+0

이상한 일이 있습니다. 나는 어떤 지연없이 onTouch 리스너에서 SoundPool.play 메서드를 사용합니다. SoundPool 생성자에 마지막 매개 변수로 0이 있지만 문서에 아무런 영향이 없다고 표시되어 있습니다. 여러 사운드를 재생할 때 여러 사운드를 병렬로 재생하도록 SoundPool을 설정합니다 (첫 번째 매개 변수는 6으로 설정 됨). 이것은 하나의 사운드가 끝나지 않고 다음 사운드가 시작될 때도 도움이됩니다. –

+0

나는 이것이 아주 좋은 정보라는 것을 알았다. 한번 시도해 보도록하겠습니다. 그러나 어떤 사람들은 내가하는 것처럼 똑같은 문제를 갖고있는 것처럼 보입니다. 그리고 그것을 쓰레드에 넣음으로써 (지금 당장은) 문제를 완벽하게 해결하는 것처럼 보입니다. 좀 더 조사 할게. 다시 한 번 도움을 주셔서 감사합니다. – fireboy0526

0

좋아, 그래서 다른 클래스에서 그것을하는 대신, 나는 하나의 클래스에서 그것을하기로 결정하고 자신에 의해 새로운 스레드를 만들었습니다. 충분히 잘 작동하는 것 같습니다.

답변으로 표시 할 것입니다.