您的位置:首页 > 移动开发 > Android开发

Android-滑动冲突解决方案

2016-05-08 17:42 495 查看
假如ScrollView中嵌套一个ViewPager,

那么,在手势操作时会发现,ViewPager的左右滚动有时会失效,因为它的上级是一个可以上下滚动的ScrollView

这种情况我们称之为:滑动冲突

解法方案有二,一是外部拦截法,二是内部拦截法。

推荐使用外部拦截!内部拦截的灵敏度貌似不如外部拦截!

以下代码仅为模板,具体的拦截我略去了,读者可自行添加。

外部拦截法

package com.che.carcheck.ui.home;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;

/**
* 外部拦截法
* <p>
* 案例:ScrollView嵌套ViewPager
* <p>
* 作者:余天然 on 16/5/8 下午5:17
*/
public class OuterScrollView extends ScrollView {

public OuterScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean isIntercept = false;
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
isIntercept = false;
break;
case MotionEvent.ACTION_MOVE:
isIntercept = canOuterIntercept(ev);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
isIntercept = false;
break;
}
return isIntercept;
}

/**
* 自定义外部拦截手势的逻辑
*
* @param ev
* @return
*/
private boolean canOuterIntercept(MotionEvent ev) {
return false;
}
}


内部拦截法

package com.che.carcheck.ui.home;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
* 内部拦截法
* <p>
* 案例:ScrollView嵌套ViewPager
* <p>
* 作者:余天然 on 16/5/8 下午5:27
*/
public class InnerViewPager extends ViewPager {
public InnerViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
if(canInnerIntercept(ev)){
//通知上级不要拦截手势
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
break;
}
return super.dispatchTouchEvent(ev);
}

/**
* 自定义内部拦截手势的逻辑
*
* @param ev
* @return
*/
private boolean canInnerIntercept(MotionEvent ev) {
return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: