zoukankan      html  css  js  c++  java
  • 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         });
  • 相关阅读:
    5_4 编码重新总结
    5_9 ___2 mc函数
    5_9 代码分析 load_pic_pointers
    5_2 实现过程中
    5_4 calvc
    428 对于 mb_cmp_init函数中一些宏定义的展开 x264_encoder_open中
    Oracle数值处理函数
    JAVA常用注解
    Java随笔
    centos 7 上Hive2.1.1的安装与基本操作
  • 原文地址:https://www.cnblogs.com/Sharley/p/6902145.html
Copyright © 2011-2022 走看看