ScrollView、viewPage滑动冲突

来源:互联网 发布:网络语吊打是什么意思? 编辑:程序博客网 时间:2024/04/30 11:17

1.冲突原因:触控事件被父控件(ScrollView)捕获,导致ViewPage不可滑动或滑动不灵敏。

2.解决思路:触控时子控件(ViewPage)先强制捕获该事件,然后根据event.Move移动的距离是否超出误差区域,是否达到纵向滑动的标准,来分发处理触控事件。


3.代码解析。

import android.content.Context;
import android.graphics.Point;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
/**
 * 解决滑动冲突,增加误差区域X/YMovingDistance判定是左右/上下滑动的最小值
 * @author Administrator
 *
 */
public class MyViewPage extends ViewPager{


/**
* viewPage点击事件
* @author Administrator
*
*/
public interface OnVpOnclick{
public void onClick();
};
OnVpOnclick mClick;  


/** 
* 记录手指按下时的坐标。 
*/
private Point downPoint = new Point();
/** 
* 记录手指移动时的坐标。 
*/  
private Point movePoint = new Point();
/** 
* 记录手机抬起时的坐标。 
*/ 
private Point upPoint = new Point();
/**
* 判定是左右滑动的最小值
*/
private int XMovingDistance = 15;
/**
* 判定是上下滑动的最小值
*/
private int YMovingDistance = 15;






public MyViewPage(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}


public MyViewPage(Context context) {
super(context);
// TODO Auto-generated constructor stub
}






public void setOnClick(OnVpOnclick mClick) {
this.mClick = mClick;
}


@Override
public void scrollTo(int x, int y) {
// TODO Auto-generated method stub
super.scrollTo(x, y);
}


@Override
public boolean onTouchEvent(MotionEvent arg0) {
// TODO Auto-generated method stub
return super.onTouchEvent(arg0);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub


switch (event.getAction()) {  
case MotionEvent.ACTION_DOWN:  
// 手指按下时,记录按下时的横坐标  
downPoint.set((int)event.getRawX(), (int)event.getRawY());
getParent().requestDisallowInterceptTouchEvent(true);//告诉父控件自己要捕获当前焦点,不要抢赞。
break;  
case MotionEvent.ACTION_MOVE:  
// 手指移动时,对比按下时的横坐标,计算出上下、左右移动的距离,
movePoint.set(
(int)event.getRawX() - downPoint.x,
(int)event.getRawY() - downPoint.y);
//            int distanceX = (int) (xMove - xDown); 
//y坐标偏移量大于上下偏移量(YMovingDistance)并且大于x坐标偏移量(XMovingDistance)。
if(Math.abs(movePoint.y) > YMovingDistance && Math.abs(movePoint.y) > Math.abs(movePoint.x)){
getParent().requestDisallowInterceptTouchEvent(false);//告诉父控件可以捕获当前焦点。
return false;
}
getParent().requestDisallowInterceptTouchEvent(true); 
break;  
case MotionEvent.ACTION_UP:  
// 手指抬起时,坐标 
upPoint.set((int)event.getRawX(), (int)event.getRawY());
//当抬起时(x,y)坐标与按下(x,y)坐标的偏移量分别小于x/yMovingDistance偏移量(即在允许偏移误差区域内)并且onClick不为null,视为点击
if(Math.abs(upPoint.x - downPoint.x) < XMovingDistance && Math.abs(upPoint.y - downPoint.y) <YMovingDistance && mClick != null){
Log.i("event_up", "onClick()");
mClick.onClick();
}else{
getParent().requestDisallowInterceptTouchEvent(false);
Log.i("event_up", "onClick==null");
}
break;  
}  
return super.onInterceptTouchEvent(event);
}




}
0 0
原创粉丝点击