直接说明下我自己项目中的情况,如图:
外部嵌套任何一种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 });