您的位置:首页 > 其它

ScrollView嵌套ViewPager引起的滑动冲突的解决方案

2015-07-15 10:19 381 查看
导读:ScrollView嵌套ViewPager引起的滑动冲突,原因是S从rollView和ViewPager都有滑动的效果,当我们发生滑动这个动作时,系统不知道 要交给那个控件来处理滑动操作,故出现了冲突。

知道了原理,我们要做的就是

1.给最先捕获事件的View一些参数,让其根据参数做比较,然后判断出Motion到底要交给谁来处理。关键点:判断x方向与y方向移动距离大小的比较,从而判断是ViewPager还是ScrollView的滑动。

或者

2.我们直接手动操作代码告诉让哪个控件来处理Motion

因此解决方案会有两种,下面就让我们一起来看看吧~~~~~~~~

方案一:

自定义ViewPager作为子控件

public class ChildViewPager extends ViewPager{

/** 触摸时按下的点 **/

PointF downP = new PointF();

/** 触摸时当前的点 **/

PointF curP = new PointF();

OnSingleTouchListener onSingleTouchListener;

public ChildViewPager(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

}

public ChildViewPager(Context context) {

super(context);

// TODO Auto-generated constructor stub

}

@Override

public boolean onInterceptTouchEvent(MotionEvent arg0) {

// TODO Auto-generated method stub

//当拦截触摸事件到达此位置的时候,返回true,

//说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent

return true;

}

@Override

public boolean onTouchEvent(MotionEvent arg0) {

// TODO Auto-generated method stub

//每次进行onTouch事件都记录当前的按下的坐标

curP.x = arg0.getX();

curP.y = arg0.getY();

if(arg0.getAction() == MotionEvent.ACTION_DOWN){

//记录按下时候的坐标

//切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变

downP.x = arg0.getX();

downP.y = arg0.getY();

//此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰

getParent().requestDisallowInterceptTouchEvent(true);

}

if(arg0.getAction() == MotionEvent.ACTION_MOVE){

//此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰

getParent().requestDisallowInterceptTouchEvent(true);

}

if(arg0.getAction() == MotionEvent.ACTION_UP){

//在up时判断是否按下和松手的坐标为一个点

//如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick

if(downP.x==curP.x && downP.y==curP.y){

onSingleTouch();

return true;

}

}

return super.onTouchEvent(arg0);

}

/**

* 单击

*/

public void onSingleTouch() {

if (onSingleTouchListener!= null) {

onSingleTouchListener.onSingleTouch();

}

}

/**

* 创建点击事件接口

* @author wanpg

*

*/

public interface OnSingleTouchListener {

public void onSingleTouch();

}

public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) {

this.onSingleTouchListener = onSingleTouchListener;

}

}

方案二:

/**

* 能够兼容ViewPager的ScrollView

* @Description: 解决了ViewPager在ScrollView中的滑动反弹问题

* @File: ScrollViewExtend.java

* @Package com.image.indicator.control

* @Author Hanyonglu

* @Date 2012-6-18 下午01:34:50

* @Version V1.0

*/

public class ScrollViewExtend extends ScrollView {

// 滑动距离及坐标

private float xDistance, yDistance, xLast, yLast;

public ScrollViewExtend(Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

switch (ev.getAction()) {

case MotionEvent.ACTION_DOWN:

xDistance = yDistance = 0f;

xLast = ev.getX();

yLast = ev.getY();

break;

case MotionEvent.ACTION_MOVE:

final float curX = ev.getX();

final float curY = ev.getY();

xDistance += Math.abs(curX - xLast);

yDistance += Math.abs(curY - yLast);

xLast = curX;

yLast = curY;

if(xDistance > yDistance){

return false;

}

}

return super.onInterceptTouchEvent(ev);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: