直接說明下我自己項目中的情況,如圖:

外部嵌套任何一種refresh下拉控件之后,上方的viewpager左右滑動事件都受到影響,滑動不流暢,稍微有點向下的趨勢就會觸發刷新。
起初以為可能跟不同下拉控件也有關系
然后嘗試了很多種方式,最后用到SwipeRefreshLayout才意識到然並卵(攤手),於是就SwipeRefreshLayout上做調整了。
中間試過很多網上的事件分發,子控件的touch事件攔截什么的,可能由於我的界面多重嵌套問題,根 本 沒 用,敲想哭的,然后在http://blog.csdn.net/u010386612/article/details/50548977看到他的自定義SwipeRefreshLayout。
1 public class VpSwipeRefreshLayout extends SwipeRefreshLayout { 2 3 private float startY; 4 private float startX; 5 // 記錄viewPager是否拖拽的標記 6 private boolean mIsVpDragger; 7 private final int mTouchSlop; 8 9 public VpSwipeRefreshLayout(Context context, AttributeSet attrs) { 10 super(context, attrs); 11 mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); 12 } 13 14 @Override 15 public boolean onInterceptTouchEvent(MotionEvent ev) { 16 int action = ev.getAction(); 17 switch (action) { 18 case MotionEvent.ACTION_DOWN: 19 // 記錄手指按下的位置 20 startY = ev.getY(); 21 startX = ev.getX(); 22 // 初始化標記 23 mIsVpDragger = false; 24 break; 25 case MotionEvent.ACTION_MOVE: 26 // 如果viewpager正在拖拽中,那么不攔截它的事件,直接return false; 27 if(mIsVpDragger) { 28 return false; 29 } 30 31 // 獲取當前手指位置 32 float endY = ev.getY(); 33 float endX = ev.getX(); 34 float distanceX = Math.abs(endX - startX); 35 float distanceY = Math.abs(endY - startY); 36 // 如果X軸位移大於Y軸位移,那么將事件交給viewPager處理。 37 if(distanceX > mTouchSlop && distanceX > distanceY) { 38 mIsVpDragger = true; 39 return false; 40 } 41 break; 42 case MotionEvent.ACTION_UP: 43 case MotionEvent.ACTION_CANCEL: 44 // 初始化標記 45 mIsVpDragger = false; 46 break; 47 } 48 // 如果是Y軸位移大於X軸,事件交給swipeRefreshLayout處理。 49 return super.onInterceptTouchEvent(ev); 50 } 51 }
是挺好用的哈,viewpager左右滑確實很流暢,但是在子pager上下拉時還是出現只能偶爾拉下來的情況,於是自己又添加了子pager的touch事件,終於沒問題了,呼~
1 vp_pet.setOnTouchListener(new View.OnTouchListener() { 2 @Override 3 public boolean onTouch(View v, MotionEvent event) { 4 switch (event.getAction()) { 5 case MotionEvent.ACTION_DOWN: 6 // 記錄手指按下的位置 7 startY = event.getY(); 8 startX = event.getX(); 9 break; 10 case MotionEvent.ACTION_MOVE: 11 // 獲取當前手指位置 12 float endY = event.getY(); 13 float endX = event.getX(); 14 float distanceX = Math.abs(endX - startX); 15 float distanceY = Math.abs(endY - startY); 16 // 如果X軸位移大於Y軸位移,那么將事件交給viewPager處理。 17 if(distanceX > distanceY) { 18 refreshLayout.setEnabled(false); 19 } 20 break; 21 case MotionEvent.ACTION_UP: 22 case MotionEvent.ACTION_CANCEL: 23 refreshLayout.setEnabled(true); 24 break; 25 } 26 return false; 27 } 28 });
