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         });
  • 相关阅读:
    .Net Remoting浅释
    初级SQL开发汇总指南
    WPF Navigation导航
    WPF Button的背景图片设置
    2015/9/20 Python基础(16):类和实例
    2015/9/19 Python基础(15):变量作用域及生成器
    2015/9/18 Python基础(14):函数式编程
    2015/9/17 Python基础(13):函数
    2015/9/15 Python基础(12):模块和包
    2015/9/10 Python基础(11):错误和异常
  • 原文地址:https://www.cnblogs.com/Sharley/p/6902145.html
Copyright © 2011-2022 走看看