2014-11-22 117 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);