参看:Android自定义视频播放器(一):https://blog.csdn.net/zxd1435513775/article/details/81507909 参看:Android自定义视频播放器(二):https://blog.csdn.net/zxd1435513775/article/details/81533053 参看:Android自定义视频播放器(三):https://blog.csdn.net/zxd1435513775/article/details/81535065 参看:Android自定义视频播放器(四):https://blog.csdn.net/zxd1435513775/article/details/81562032
一、引言下面要实现,点击屏幕隐藏控制面板,若控制面板显示,则过几秒自动隐藏控制面板的效果。 首先需要,把控制面板自定义布局加上id,并实例化。
此处也可以再media_controller布局的根元素上加,效果一样。
二、隐藏和显示控制面板 1、隐藏方法/**
* 隐藏控制面板
*/
private void hideMediaController() {
media_controller.setVisibility(View.GONE);
isshowMediaController = false; //该参数用于表示面板是否显示,默认隐藏
}
2、显示方法
/**
* 显示控制面板
*/
private void showMediaController() {
media_controller.setVisibility(View.VISIBLE);
isshowMediaController = true;
}
3、在MyPreparedListener中设置隐藏
private class MyPreparedListener implements MediaPlayer.OnPreparedListener {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
//视频准备好了,进行播放
mediaPlayer.start();
//视频的总时长,并关联SeekBar的总长度
int duration = videoView.getDuration();
//设置SeekBar进度的总长
seekbarVideo.setMax(duration);
//设置视频的总时间
tvDuration.setText(utils.stringForTime(duration));
//发消息
handler.sendEmptyMessage(PROGRESS);
//默认是隐藏控制面板
hideMediaController();
}
}
4、实现手势识别器
class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener {
//长按监听
@Override
public void onLongPress(MotionEvent e) {
startAndPause();
}
//点击两次监听
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
//setFullScreenAndDefault();
return super.onDoubleTapEvent(e);
}
//点击一次监听
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
if (isshowMediaController) {
//隐藏
hideMediaController();
//把隐藏消息移除
handler.removeMessages(HIDE_MEDIACONTROLLER);
} else {
//显示
showMediaController();
//过4秒,自动发消息隐藏控制面板消息
handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
}
return super.onSingleTapConfirmed(e);
}
需要在初始化的时候,初始化手势识别器
//实例化手势识别器,并且重写双击,点击,长按
detector = new GestureDetector(this, new MySimpleOnGestureListener());
需要在onTouchEvent方法中,将事件传递给手势识别器:
//3.把事件传递给手势识别器
detector.onTouchEvent(event);
5、Handler消息处理
case HIDE_MEDIACONTROLLER://隐藏控制面板
hideMediaController();
break;
三、需要注意的地方
1、需要移除handler发送的消息的地方
(1)声音SeekBar的事件监听处
class VoiceOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
if (progress > 0) {
isMute = false;
} else {
isMute = true;
}
updataVoice(progress, isMute);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
handler.removeMessages(HIDE_MEDIACONTROLLER);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
}
}
(2)视频播放SeekBar的事件监听处
class VideoOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
videoview.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
handler.removeMessages(HIDE_MEDIACONTROLLER);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
}
}
(3)物理按键,调节声音的事件监听处
/**
* 监听物理健,实现声音的调节大小
*
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
currentVoice--;
updataVoice(currentVoice, false);
handler.removeMessages(HIDE_MEDIACONTROLLER);
handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
return true;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
currentVoice++;
updataVoice(currentVoice, false);
handler.removeMessages(HIDE_MEDIACONTROLLER);
handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
return true;
}
return super.onKeyDown(keyCode, event);
}
(4)所有点击事件监听处
@Override
public void onClick(View v) {
if (v == btnVoice) {
isMute = !isMute;
// Handle clicks for btnVoice
updataVoice(currentVoice, isMute);
} else if (v == btnSwichPlayer) {
// Handle clicks for btnSwichPlayer
showSwichPlayerDialog();
} else if (v == btnExit) {
// Handle clicks for btnExit
finish();
} else if (v == btnVideoPre) {
// Handle clicks for btnVideoPre
playPreVideo();
} else if (v == btnVideoStartPause) {
// Handle clicks for btnVideoStartPause
startAndPause();
} else if (v == btnVideoNext) {
// Handle clicks for btnVideoNext
playNextVideo();
} else if (v == btnVideoSiwchScreen) {
// Handle clicks for btnVideoSiwchScreen
setFullScreenAndDefault();
}
handler.removeMessages(HIDE_MEDIACONTROLLER);
handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
}
6、onTouchEvent()方法中
@Override
public boolean onTouchEvent(MotionEvent event) {
//把事件传递给手势识别器
detector.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN://手指按下
...
handler.removeMessages(HIDE_MEDIACONTROLLER);
break;
case MotionEvent.ACTION_MOVE://手指移动
...
break;
case MotionEvent.ACTION_UP://手指离开
handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
break;
}
return super.onTouchEvent(event);
}