一直以来,Viewpager和ScrollView总像是一对冤家不能共存
而为了解决这个问题许许多多的程序员们也想了很多的办法
今天就来说一个比较简单的
首先说说原理吧
这两个控件之所以冲突其实还是因为一个叫做"事件分发"的机制的存在
要解决这个问题,首先需要改写ScrollView
即在触摸事件拦截器里面进行判断,
如果横着滑动的距离大于竖着滑动的距离,
就让事件分发的方法返回false
也就是不拦截当前事件,传递给下一层执行
以下是我自己重写的ScrollView,分享给大家
import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ScrollView; public class MyScrollView extends ScrollView{ private float xDistance; private float yDistance; private float xLast; private float yLast; public MyScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public MyScrollView(Context context) { super(context); } /** * 在该方法中进行判断 * @param ev * @return */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: xDistance = yDistance = 0.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); if(xDistance > yDistance) return false; break; default: break; } return super.onInterceptTouchEvent(ev); } }