Scrollview 中嵌套viewpager 影响viewpager横向滑动的原因是viewpager中本身存在的手势事件和scrollview的事件相冲突,解决方法为重写
onScrollChanged 事件,起一个线程,不断判断滑动是否为横向滑动大于纵向滑动,具体代码如下:将ScrollView 替换成如下的自定义viewpager;
public class PullableScrollView extends ScrollView implements Pullable {private float xDistance, yDistance, xLast, yLast; int newy=0; int oldy=-1; boolean flag=false; private OnScrollListener onScrollListener; private PauseOnScrollListener onScrollListeners; public PullableScrollView(Context context) { super(context); } public PullableScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public PullableScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean canPullDown() { if (getScrollY() == 0) return true; else return false; } @Override public boolean canPullUp() { if (getScrollY() >= (getChildAt(0).getHeight() - getMeasuredHeight())) return true; else return false; } public void setOnScrollListener(OnScrollListener onScrollListener) { this.onScrollListener = onScrollListener; } public void setOnScrollListener(PauseOnScrollListener onScrollListener) { this.onScrollListeners = onScrollListener; } @Override public int computeVerticalScrollRange() { return super.computeVerticalScrollRange(); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if(onScrollListener != null){ onScrollListener.onScroll(t); } newy=oldt; if (!flag){ flag=true; new Thread(new Runnable() { @Override public void run() { thread_run(); } }).start(); } Log.e(l+"aaa"+t+"bb",oldl+"ccc"+oldt); if(t==oldt){ if(onScrollListener != null){ } } } void thread_run() { while (flag) { if (oldy == newy) { flag = false; onScrollListener.onstop(); } else { oldy=newy; } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * * 滚动的回调接口 */ public interface OnScrollListener{ /** * 回调方法, 返回MyScrollView滑动的Y方向距离 * @param scrollY * 、 */ public void onScroll(int scrollY); public void onstop(); } @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); } }