2014-11-22 155 views
3

我想通過onTouch連續播放槍聲。我正在這樣做自動槍聲。所以我有問題,有延遲的聲音循環。這並沒有給出真正的自動槍聲效果。我的主要觀點是,聲音一再播放時不應有任何延遲。 我的代碼是。連續播放聲音onTouch()

public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     mediaPlayer = MediaPlayer.create(RipleFire.this, 
       sounds[position]); 
     // if (mediaPlayer != null && mediaPlayer.isPlaying()) { 
     // mediaPlayer.stop(); 
     // } 
     try { 
      mediaPlayer.prepare(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     imgflag.setImageResource(pistols[position]); 

     imgflag.setImageResource(pistolsAnimations[position]); 
     mediaPlayer.start(); 
     mediaPlayer.setLooping(true); 

    } else if (event.getAction() == MotionEvent.ACTION_UP) { 
     mediaPlayer.stop(); 
     mediaPlayer.reset(); 
     mediaPlayer.release(); 
     imgflag.setImageResource(pistols[position]); 
    } 

    return true; 
} 
+0

嘗試將您的代碼放入runOnUiThread()檢查:http:// stackoverflow。com/questions/27039503/update-textview-volume-up-key-is-pressed/27039696#27039696 – 2014-11-22 05:53:25

+0

HareshChhelana runOnUiThread()對我來說不起作用。 – Rayyan 2014-11-22 06:41:23

回答

1

他們根據你的問題 方法-1 簡單,你可以通過觸摸的聲音觸摸方法來覆蓋啓動有沒有可能解決方案。

@Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        mPlayer.setLooping(true); 
        mPlayer.start(); 
        break; 
       case MotionEvent.ACTION_UP: 
        mPlayer.pause(); 
        break; 
       } 
       return true; 
      } 
    //or 
    public boolean onTouch(View v, MotionEvent me) { 
    switch(me.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      if(!mPlayer.isPlaying()) mPlayer.start(); 
      break; 
     case MotionEvent.ACTION_UP: 
      if(mPlayer.isPlaying()) mPlayer.stop(); 
      break; 
    } 
} 

方法-2 您還可以使用可運行的胎面或運行方法

Boolean IsPressed = false; 
Button mbtn = (Button) findViewById(R.id.mbtn); 

然後添加一個線程,在方法運行現在添加以下代碼

@Override 
public void run(){ 
     while(!btnIsPressed){ 
      myfunction(); 
     } 
} 

,在onCreate方法中,添加一個監聽器,將布爾值更改爲true,例如:

mbtn.addOnClickListener(new OnClickListener(){ 

    @Overrride 
    public void onClick(View v){ 
     btnIsPressed = true; 
    } 
}); 

編輯: 我有包括另一方法-3這裏我們運行一個線程,每當你觸摸視圖,它檢查isPress與否,如果被觸摸,然後重複視圖的聲音,直到除非當你釋放視圖從觸摸。

這裏我張貼整個代碼爲你解答

public class Soundstuff extends Activity implements OnTouchListener { 
    SoundPool sP; 
    boolean isPress = false; 
    int gunshot = 0; 
    private Handler handler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     View v = new View(this); 
     setContentView(v); 

     v.setOnTouchListener(this); 

     sP = new SoundPool(2, AudioManager.STREAM_MUSIC, 0); 
     gunshot = sP.load(this, R.raw.gunshot, 1); 

    } 

    private Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 
      /* do what you need to do */ 
      if (isPress) { 
       sP.play(gunshot, 1, 1, 0, 0, 1); 
       /* and here comes the "trick" */ 
       handler.postDelayed(this, 300); 
      } else { 
      } 
     } 
    }; 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      isPress = true; 
      handler.postDelayed(runnable, 300); 
      break; 

     case MotionEvent.ACTION_UP: 
      isPress = false; 
      handler.postDelayed(runnable, 300); 
      break; 
     } 

     return true; 
    } 
} 

希望這將解決您的問題。 SourceCode

0

同意@haresh: 試試這個..

runOnUiThread(new Runnable() { 
        public void run() { 

         if (pd.isShowing()) { 

          pd.dismiss(); 
         } 
         Toast.makeText(getApplicationContext(), "" + msg, 
           Toast.LENGTH_LONG).show(); 

        } 
       }); 

這裏我米關閉進度對話框,並在屏幕上。你可以啓動或停止媒體播放器這樣的方式顯示一些味精。

+0

不適用於我, – Rayyan 2014-11-22 06:44:10

+1

在事件外聲明你的mp對象動作而不是內部,只是根據你想要的內部動作開始和停止,另一件事是嘗試onPause()而不是onStop()方法。 – Radhey 2014-11-22 06:54:54

+0

仍然是同樣的問題 – Rayyan 2014-11-22 06:59:19

1

使用SoundPool而不是MediaPlayer。

SoundPool sP = new SoundPool(2, AudioManager.STREAM_MUSIC, 0); 
gunshot = sP.load(this, R.raw.gunshot, 1); 
sP.play(gunshot, 1, 1, 0, 0, 1);