先看下效果
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);
}
上面的算是記錄下項目中踩到的坑吧,以后可能還會遇到同樣的問題。有些地方描述的可能也有錯,請指證。