在scrollview里面嵌入viewpager的时候,会出现左右滑动viewpager的时候,刚开始可以滑动一小段,但是马上viewpager就会失去手势事件而回归原位,但是手指并没有离开屏幕或者离开viewpager所在区域。这是由于scrollview这个父布局回合viewpager抢夺手势这个事件,重写scrollview,在事件拦截的方法里做一些判断就可以了,参考了网上的一些例子,下面是对应代码----
/**
* 能够兼容ViewPager的ScrollView
*
* @Description: 解决了ViewPager在ScrollView中的滑动反弹问题
*/
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);
}
}
在判断角度的位置(红色部分),可以根据需求自己去建立临界值来作为判断依据即可。
其实弄清android事件的传递机制,也就知道在什么位置去拦截分发对应的事件了,本人目前也不是非常清楚明白,回头有空写一个demo来测试一下。