Android解决下拉刷新控件SwipeRefreshLayout和ViewPager的滑动冲突

直接说明下我自己项目中的情况,如图:

Android解决下拉刷新控件SwipeRefreshLayout和ViewPager的滑动冲突_第1张图片

外部嵌套任何一种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         });

 

转载于:https://www.cnblogs.com/Sharley/p/6902145.html

你可能感兴趣的:(Android解决下拉刷新控件SwipeRefreshLayout和ViewPager的滑动冲突)