如题,当SwipeRefreshLayout包裹ViewPager时,发现ViewPager经常滑不动,容易把上面的刷新的小圈圈拽出来,只有手指在屏幕上向斜上方滑或者水平滑动,才能保持正常,这是一个滑动冲突问题。

首先上网查一下别人怎么解决的

好像都是这个解决方案:

viewPager.setOnTouchListener(new View.OnTouchListener() {

      public boolean (View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
swipeRefreshLayout.setEnabled(false);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
swipeRefreshLayout.setEnabled(true);
break;
}
return false;
}
});

问题

嗯,代码看起来很美好,但是运行的时候发现,当下拉的手速比较慢时,刷新不能用了,说明SwipeRefreshLayout没有拦截到事件,然后到ViewPager这儿,就被禁用了。 其实看一下SwipeRefreshLayout的源码就能发现问题:
在SwipeRefreshLayout的构造器里有这么一句

mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop()

然后在onInterceptTouchEvent()方法中有这么一段:

final float yDiff = y - mInitialDownY;
if (yDiff > mTouchSlop && !mIsBeingDragged) {
mInitialMotionY = mInitialDownY + mTouchSlop;
mIsBeingDragged = true;
mProgress.setAlpha(STARTING_PROGRESS_ALPHA);
}

好了,问题如此清晰明了,当我们下拉的时候比较慢,第一次手指在y轴滑动的距离还不够mTouchSlop那么长,所以没有拦截,那viewpager秒秒钟给它禁掉了,因为我们在上面重写了ViewPager的触摸事件,之后yDiff的距离够长了,但是它已经被禁掉啊,然后就会出现只有一个半透明的小球滑下来,然后收上去了,什么也没发生……

解决方案

其实,这个滑动冲突的问题的关键在于,当手指向斜下方滑动时,手指在屏幕上移动的x轴的距离大于y轴的距离,这个时候我们是想让viewpager响应的,那重写SwipeRefreshLayout的onInterceptTouchEvent()方法就好了啊,当滑动X轴的距离大于Y轴的距离就让SwipeRefreshLayout不要拦截事件,完整的代码如下:

public 大专栏  ViewPager 和 SwipeRefreshLayout 的滑动冲突yword">class ReformSwipRefreshLayout extends SwipeRefreshLayout {
private float startY;
private float startX; private boolean mIsDraggingFlag;
private final int mTouchSlop; public ReformSwipRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
} public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
startY = ev.getY();
startX = ev.getX();
// 初始化标记
mIsDraggingFlag = false;
break;
case MotionEvent.ACTION_MOVE:
// 如果子view正在拖拽中,则不拦截
if(mIsDraggingFlag) {
return false;
}
float endY = ev.getY();
float endX = ev.getX();
float distanceX = Math.abs(endX - startX);
float distanceY = endY - startY;
// 如果X轴位移大于Y轴位移或者Y轴位移为负数时,事件交给子View处理
if(distanceX > mTouchSlop && distanceX>distanceY) {
mIsDraggingFlag = true;
return false;
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
// 初始化标记
mIsDraggingFlag = false;
break;
}
return super.onInterceptTouchEvent(ev);
} }

ViewPager 和 SwipeRefreshLayout 的滑动冲突的更多相关文章

  1. 滑动ViewPager引起swiperefreshlayout刷新的冲突

    ViewPager是Android中提供的页面切换的控件,SwipeRefreshLayout是Android提供的下拉刷新控件,通过SwipeRefreshLayout可以很简单的实现下拉刷新的功能 ...

  2. 解决ViewPager与百度地图滑动冲突

    一.问题描述 ViewPager中嵌套百度地图的时候会出现百度地图滑动冲突. 二.期望结果: 滑动地图的时候只有地图滑动,滑动其他区域可以切换viewpager. 三.解决方法 自定义viewpage ...

  3. (转载)Android滑动冲突的完美解决

    Android滑动冲突的完美解决 作者:softwindy_brother 字体:[增加 减小] 类型:转载 时间:2017-01-24我要评论 这篇文章主要为大家详细介绍了Android滑动冲突的完 ...

  4. ViewPager和SwipeRefreshLayout之间嵌套使用时发生"事件"冲突

    有时候我们会有一种需求,一个ViewPager有n个页面,每个页面是一个Fragment,在Fragment中使用了具有垂直滑动属性的控件,比如SwipeRefreshLayout!!! 这时二者之间 ...

  5. android 布局 使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题

    使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题. 我的问题原型: 这个问题,我相信遇到的人会比较少,我是在 一个 viewPager 中,其中 一个 fragment 中实现了 ...

  6. (转)ViewPager,ScrollView 嵌套ViewPager滑动冲突解决

    ViewPager,ScrollView 嵌套ViewPager滑动冲突解决 本篇主要讲解一下几个问题 粗略地介绍一下View的事件分发机制 解决事件滑动冲突的思路及方法 ScrollView 里面嵌 ...

  7. 扩展ViewFlow避免和ViewPager滑动冲突,同时支持无限循环,并完美和CircleFlowIndicator结合

    首先,为了避免滑动冲突,我们要继承ViewFlow,重写onInterceptTouchEvent public class MyViewFlow extends ViewFlow { private ...

  8. 解决ScrollView嵌套ViewPager出现的滑动冲突问题

    /**       *         解决ScrollView嵌套ViewPager出现的滑动冲突问题       */       public class ScrollView1 extends ...

  9. Android ScrollView与ViewPager滑动冲突

    前段时间做项目碰到在ScrollView里添加ViewPager,但是发现ViewPager的左右滑动和ScrollView的滑动冲突了,解决这个问题的方法是重写ScrollView. 代码: pub ...

随机推荐

  1. 杂记 -- 关于less在vue项目中的使用

    1.安装less,less-loader npm install less less-loader --save 2.配置wepack.js(vue3+版本中不用自己设置) //添加less路径模块 ...

  2. memset的常见用法

    头文件 <cstring> 描述 因为memset函数按照字节填充,所以一般memset只能用来填充char型数组 ------------------------------------ ...

  3. 题解 LOJ-6485 【LJJ学二项式定理】

    题目 由于看到正解的单位根反演过于复杂 (也就是看不懂) 所以自己构造了一个算法,理论上这个算法应该还有成长的空间(可以变得普适性更强) 不知道和单位根反演有没有一样,就发表出来了 反正转载前记得要联 ...

  4. 吴裕雄--天生自然Linux操作系统:Linux 远程登录

    Linux一般作为服务器使用,而服务器一般放在机房,你不可能在机房操作你的Linux服务器. 这时我们就需要远程登录到Linux服务器来管理维护系统. Linux系统中是通过ssh服务实现的远程登录功 ...

  5. 吴裕雄--天生自然 PHP开发学习:MySQL 插入数据

    <?php $servername = "localhost"; $username = "root"; $password = "admin& ...

  6. JSON字符串

    原因:由于之前接触的JSON都是字符串与数组之间的转化,思维定式认为JSON只是字符串与数组的转化 这个原因是错误的 首先 JSON 是一种语法,用来序列化对象.数组.数值.字符串.布尔值和 null ...

  7. POJ-2031 Building a Space Station (球的最小生成树)

    http://poj.org/problem?id=2031 Description You are a member of the space station engineering team, a ...

  8. PANIC: ANDROID_SDK_HOME is defined but could not find Nexus_5_API_23.ini file in $ANDROID_SDK_HOME\

    运行模拟器总是出现这个错误 后来把系统环境变量中的ANDROID_SDK_HOME 删掉就好了 我去,好神奇的操作

  9. vue动态绑定class,tab栏

  10. iTOP-iMX6UL开发板-MiniLinux-CAN测试使用文档

    本文档介绍的是迅为iMX6UL开发板在 MiniLinux 系统环境下 iTOP-iMX6UL CAN 实验调试步骤.给用户提供了“can_libs.rar”.“can_tools.zip”和“can ...