最近在开发的项目中有一个左滑右滑浏览照片和视频的模块,然后滑动到视频的时候点击可以播放,播放器用的是饺子播放器 jiaozivideoplayer 的GitHub地址,项目需求是点击播放的时候可以左右滑动进行快进 / 快退,但是滑动只是切换下一个,不能改变进度,很明显是和 RecyclerView 起了滑动冲突了,这个问题困扰了我很久,下面分享一下我的解决办法,先看看效果吧:
二、触摸事件拦截首先对父View的触摸事件进行拦截 onInterceptTouchEvent(),这里需要注意的是ACTION_DOWN 不能拦截,我这里是根据播放状态 isPlay 返回当前是否拦截滑动事件
recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
XYLogger.INSTANCE.d(TAG, "onInterceptTouchEvent: 1");
return false;
} else {
if (isPlay) {
XYLogger.INSTANCE.d(TAG, "onInterceptTouchEvent: 2");
return true;
} else {
XYLogger.INSTANCE.d(TAG, "onInterceptTouchEvent: 3");
return false;
}
}
}
@Override
public void onTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean b) {
}
});
这样处理就完了吗?没有,RecycleView 相当于父 View ,父 VIew 的触摸事件被拦截了,子 View 的触摸事件是接收不到的,至于为什么这样可以看一下View的事件的传递,所以我们需要在子 View 的dispatchTouchEvent处理一下,告诉 父 VIew 不要拦截 子View的事件
getParent().requestDisallowInterceptTouchEvent(true);
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
if (isPlaying){
//正在播放中
Log.d(TAG, "dispatchTouchEvent: 正在播放中");
getParent().requestDisallowInterceptTouchEvent(true);
}else {
Log.d(TAG, "dispatchTouchEvent: 播放已暂停");
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
//这里不能返回false
return super.dispatchTouchEvent(ev);
}
这样已处理的话,就可以达到播放视频的时候把父 View 的滑动事件禁止掉,若大家发现有什么问题,欢迎指正。
作者:BigBigManLx