Activity里由VeiwPager2+Fragment+RecyclerView组合,在下拉Recyclerview时ViewPager2特别灵敏,非常容易左右滑动。
解决思路是通过手势监听在下拉时禁止viewpager2滑动
在Activity里实现dispatchTouchEvent方法
private var startX = 0
private var startY = 0
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
when(ev?.action){
MotionEvent.ACTION_DOWN ->{
startX = ev.x.toInt()
startY = ev.y.toInt()
}
MotionEvent.ACTION_MOVE ->{
val endX = ev.x.toInt()
val endY = ev.y.toInt()
val tempX = abs(endX - startX)
val tempY = abs(endY - startY)
if(tempX < tempY){
ac.binding.actWatchfaceViewPage.isUserInputEnabled = false
}
}
MotionEvent.ACTION_UP ->{
startX = 0
startY = 0
ac.binding.actWatchfaceViewPage.isUserInputEnabled = true
}
MotionEvent.ACTION_CANCEL->{
}
}
return super.dispatchTouchEvent(ev)
}
PS ViewPage1 是这样写的
public class CustomViewPager extends ViewPager {
private static final int TOUCH_SLOP = 30; // 你可以调整这个值来改变灵敏度
private float mDownX;
private float mLastX;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = ev.getX();
mLastX = mDownX;
break;
case MotionEvent.ACTION_MOVE:
final float deltaX = Math.abs(ev.getX() - mLastX);
if (deltaX > TOUCH_SLOP) {
// 当滑动距离超过TOUCH_SLOP时,才拦截事件
return true;
}
break;
}
mLastX = ev.getX();
return super.onInterceptTouchEvent(ev);
}
}