2016-12-24 133 views
0

我刚刚完成播放声音时,按下按钮的Android按下按钮,长时间播放声音

,但我有一个短促的声音,如“蜂鸣声”,这小于1秒

我怎么能按下按钮播放声音,直到扣上?

bt = (Button)findViewById(R.id.clickme); 
    final MediaPlayer mp = MediaPlayer.create(this, R.raw.beep); 
    bt.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mp.start(); 
     } 
    }); 

回答

0

您可以使用下面的代码:

bt.setOnTouchListener(this); 

@Override 
public boolean onTouch(View arg0, MotionEvent event) { 

    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     System.out.println("touch"); 
     mp.setLooping(true); 
     mp.start(); 
     break; 
    case MotionEvent.ACTION_UP: 
     System.out.println("up"); 
     mp.pause(); 
     break; 
    } 

    return true; 
} 

我做了一些研究,发现Android的Mediaplayer有弹无间断的声音,而循环的问题..

看到这个:Gapless Playback with android MediaPlayer

我也发现几个解决方案:

  1. 使用OGG格式的声音文件(https://en.wikipedia.org/wiki/.ogg
  2. 可以使用的Soundpool它有一个循环和缓存设备的媒体播放(https://developer.android.com/reference/android/media/SoundPool.html

你也可以使用以下类别:看看它是否工作..

public class LoopMediaPlayer { 

    public static final String TAG = LoopMediaPlayer.class.getSimpleName(); 

    private Context mContext = null; 
    private int mResId = 0; 
    private int mCounter = 1; 

    private MediaPlayer mCurrentPlayer = null; 
    private MediaPlayer mNextPlayer = null; 

    public static LoopMediaPlayer create(Context context, int resId) { 
     return new LoopMediaPlayer(context, resId); 
    } 

    private LoopMediaPlayer(Context context, int resId) { 
     mContext = context; 
     mResId = resId; 

     mCurrentPlayer = MediaPlayer.create(mContext, mResId); 
     mCurrentPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mediaPlayer) { 
       mCurrentPlayer.start(); 
      } 
     }); 

     createNextMediaPlayer(); 
    } 

    private void createNextMediaPlayer() { 
     mNextPlayer = MediaPlayer.create(mContext, mResId); 
     mCurrentPlayer.setNextMediaPlayer(mNextPlayer); 
     mCurrentPlayer.setOnCompletionListener(onCompletionListener); 
    } 

    private MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
      mediaPlayer.release(); 
      mCurrentPlayer = mNextPlayer; 

      createNextMediaPlayer(); 

      Log.d(TAG, String.format("Loop #%d", ++mCounter)); 
     } 
    }; 
} 

t Ø使用它只需调用mp.setLooping(true);

+0

感谢您的回复,循环工作,但我的声源是1秒,我举行1秒后,它有一个约0.1秒循环声音的间隔。如何将间隔时间设置为0? –

+0

所以循环之间有一个GAP,你想把GAP时间设置为0 .. – rafsanahmad007

+0

是的,差距时间 –

0

使用OnTouchListener

bt.setOnTouchListener(new View.OnTouchListener() {   
@Override 
public boolean onTouch(View v, MotionEvent event) { 
    switch(event.getAction()) { 
     case MotionEvent.ACTION_DOWN: // Button Pressed  
      mp.reset(); 
      mp.setDataSource(mediapath); 
      mp.prepare(); 
      mp.start();   

      return true; 
     case MotionEvent.ACTION_UP:// Button released 
      mp.stop(); 
      return true; 
    } 
    return false; 
} 
}); 
+0

感谢答复

LoopMediaPlayer.create(context, R.raw.sound_file_name); 

这一翻译,但只能玩一次。第二次按下按钮时不能播放。 –