方法一:
問題來源:看過源碼之后發(fā)現(xiàn)在onInterceptTouchEvent中的只要Y軸的移動距離大于? mTouchSlop這個值后就會觸發(fā)下拉刷新的操作。深追之后發(fā)現(xiàn)這個值只有8dp,就是說? 當(dāng)我們下滑了8dp的距離就會開始下拉刷新。那么找到了原因我們開始解決他把。
? -->> 解決方案:自定義一個SwipeRefreshLayout, 在它的onInterceptTouchEvent中,根據(jù)X 軸和Y 軸的 移動的距離差 如果xDis大于YDis?那么不攔截觸摸事件,交給ViewPager處理。反之,交給SwipeRefreshLayout處理。
代碼:
// 判斷 X 軸的 Y 軸的 移動的距離差 來判斷是否 需要攔截事件
public class MySwipeRefreshLayout extends SwipeRefreshLayout {
// 上一次觸摸時的X坐標(biāo)
private float mPreDownX;
private float mPreDownY;
public MySwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mPreDownX = ev.getX();
mPreDownY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float eventX = ev.getX();
final float eventY = ev.getY();
float xAbs = Math.abs(eventX - mPreDownX);
float yAbs = Math.abs(eventY - mPreDownY);
// 如果 X 軸移動的 距離大于 Y 軸移動的距離
// 那么 不攔截 觸摸事件 交給 下面的處理
if (xAbs > yAbs) {
return false;
}
}
return super.onInterceptTouchEvent(ev);
}
}
方法二:
ViewPager,設(shè)置OnTouchListener,里面當(dāng)ACTION_MOVE的時候設(shè)置SwipeRefreshLayout不可用,
當(dāng)ACTION_UP或者ACTION_CANCEL的時候設(shè)置SwipeRefreshLayout可以,就可以解決這個沖突了
viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
swipeRefreshLayout.setEnabled(false);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
swipeRefreshLayout.setEnabled(true);
break;
}
return false;
}
});