遇到这个问题,我们首先分析一下,当我们手指水平滑动时(并不一定是真正的水平,有可能在竖直方向也有位置变化),首先是最外部的ScrollView捕捉到滑动Event,如果其中包含了竖直滑动,那么它就不再抛出该信息,导致整个ScrollView的竖直滑动,而原本我们想要水平滑动的内部控件没有滑动。
为了解决这个问题,我们可以对滑动这个动作加以判断:如果滑动的水平距离大于竖直距离,那么认为它是水平滑动,否则认为它是竖直滑动。而这个判断该如何实现,在哪里实现?我们想,既然是ScrollView的错,那么我们可以自定义一个ScrollView来实现该解决方法。
代码如下,我们自定义MyScrollView:
public class MyScrollView extends ScrollView {
private float xDistance , yDistance , xLast , yLast;
public MyScrollView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
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);
}
}
重写onInterceptTouchEvent(MotionEvent ev)方法。为什么不是重写onTouchEvent呢,同学可以搜索一下。