您的位置:首页 > 移动开发 > Android开发

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

2017-05-25 09:42 801 查看
直接说明下我自己项目中的情况,如图:



外部嵌套任何一种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         });
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: