安卓下拉刷新与轮播图滑动冲突解决方案

  

最近在开发中遇到了这样一个问题,在下拉刷新组件中包含了一个轮播图组件,当左右滑动的图片时很容易触发下拉刷新,如下图所示:

  

 Android下拉刷新与轮播图滑动冲突解决方案

  

如图中红色箭头所示方向切换轮播图,很容易触发下拉刷新。网上查了很多方法,发现都不能很好的解决,于是自己研究了下。

  

<强>我选用的第三方控件

  

1。下拉刷新我选用的是chanven的CommonPullToRefresh(系统自带的SwipeRefreshLayout也应该是一样的道理),
  

  

2。轮播图选用的是daimajia的AndroidImageSlider(用:viewpage也是一样的道理)。具体界面自行脑补哈。

  

  

我们仔细分析一下,我们要解决的实际上就是控件的事件拦截问题。现在的情况是外层的控件已经拦截了斜着滑动的事件,那么我们只要让外层的控件把这个事件分发下去就可以了【在dispatchTouchEvent (MotionEvent ev)方法中处理,那么问题来了,怎么判断斜着的事件。网上有很多方案,但都不是很完美。我想到了一种,跟大家分享一下,先看图:

  

 Android下拉刷新与轮播图滑动冲突解决方案

  

方案分析

  

1。图一中x=y,作为临界条件,这时α刚好等于45°;
  

  

2。图二中x 45°,这时我们判断为上下移动;
  

  

3。图三中x> y,α<45°,这时我们判断为左右移动。
  

  

那么我们只要判断tan(α)与谭(45)的关系就能判断是左右还是上下移动。我们写一个类继承PtrClassicFrameLayout、下面是关键代码:

        公开课SubPtrClassicFrameLayout延伸PtrClassicFrameLayout {      私人mDownX浮动;   私人mDownY浮动;      公共SubPtrClassicFrameLayout(上下文语境){   超级(上下文);   }      公共SubPtrClassicFrameLayout(上下文语境,AttributeSet attrs) {   超级(上下文,attrs);   }      公共SubPtrClassicFrameLayout(上下文语境、AttributeSet attrs int defStyle) {   超级(上下文、attrs defStyle);   }      @Override   公共布尔dispatchTouchEvent (MotionEvent ev) {   开关(ev.getAction ()) {   案例MotionEvent.ACTION_DOWN:   mDownX=ev.getX ();   mDownY=ev.getRawY ();   打破;   案例MotionEvent.ACTION_MOVE:   浮动moveX=ev.getX ();   浮动moveY=ev.getRawY ();   浮动diffX=数学。abs (moveX mDownX);   浮动diffY=数学。abs (moveY mDownY);   布尔数学isHorizon=L?diffY/diffX) & lt;Math.tan (45.0);   如果(isHorizon) {   返回dispatchTouchEventSupper (ev);   }   打破;   }   返回super.dispatchTouchEvent (ev);   }      }      之前      

我们可以看的到,其实很简单,关键就是判断当前位置相对于初始位置的滑动方向。
  

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

安卓下拉刷新与轮播图滑动冲突解决方案