Android解決下拉刷新控件SwipeRefreshLayout和ViewPager的滑動沖突


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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM