先看下效果
GIF.gif效果上可以看到 有下拉刷新Banner还需要可以滑动
网上找了一圈都没有相关的,要么就是改RecyclerView的要么就是改ViewPager然后验证了之后都不管用。
后来还是根据网上ListView嵌套ViewPager部分代码修改完成实现想要的效果。
提一下,在实现的时候 public boolean dispatchTouchEvent(MotionEvent ev)
这个方法里添加的事件分发并不管用,而网上很多都是在这个方法里进行实现的。
项目中用到的是LoopRecyclerViewPager
这个类,然后自己重写的,所以也有可能是继承的类不一样所以方法不生效的问题
PointF downP = new PointF();
PointF curP = new PointF();
private float xDown;// 记录手指按下时的横坐标。
private float xMove;// 记录手指移动时的横坐标。
private float yDown;// 记录手指按下时的纵坐标。
@Override
public boolean onTouchEvent(MotionEvent ev) {
// 每次进行onTouch事件都记录当前的按下的坐标
curP.x = ev.getX();
curP.y = ev.getY();
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 这两个参数记录的暂时不知道做什么用,也没有地方进行引用。
downP.x = ev.getX();
downP.y = ev.getY();
xDown = ev.getX();
yDown = ev.getY();
// 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
getParent().requestDisallowInterceptTouchEvent(true);
}
// 重点方法在这里了,移动的时候进行判断
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
xMove = ev.getX();
float yMove = ev.getY();
// 这里判断是横向还是纵向移动,
if (Math.abs(yMove - yDown) < Math.abs(xMove - xDown) && Math.abs(xMove - xDown) > 2) {
// 这里还要再进行一次判断,不然横向滑动的时候直接没效果了
if (Math.abs(xMove - xDown) > 2) {
// 通知父控件不要进行拦截了,事件自己消费
getParent().requestDisallowInterceptTouchEvent(true);
} else {
// 这里返回False 事件自己消费了,不用往下传递。
return false;
}
} else {
// 通知父控件进行事件拦截
getParent().requestDisallowInterceptTouchEvent(false);
}
}
return super.onTouchEvent(ev);
}
上面的算是记录下项目中踩到的坑吧,以后可能还会遇到同样的问题。有些地方描述的可能也有错,请指证。
网友评论