仿淘宝的商品详情拖动遇到的问题。 使用结构就是DirectionalViewPager 嵌套了(1)ScrollView (2)WebView android
状况: 竖直方向的ViewPager DirectionalViewPager 嵌套了(1)ScrollView (2)WebView 出现滑动冲突web
实现目标: (1)在ScrollView滑动到底部时,继续下拉触发DirectionalViewPager的滑动切换 (2)在WebView 滑动到顶端时,继续上拉触发DirectionalViewPager的滑动切换ide
利用void android.view.ViewGroup.requestDisallowInterceptTouchEvent(boolean disallowIntercept)方法 在子控件上通知外层的ViewPager进行事件拦截和 不拦截code
要点1 判断ScrollView在底部事件
int scrollY = svInfo.getScrollY(); int height = svInfo.getHeight(); int scrollViewMeasuredHeight = svInfo.getChildAt(0) .getMeasuredHeight();图片
if ((scrollY + height) == scrollViewMeasuredHeight) { //在底部 }webview
要点2 判断WebView在顶部get
if (mWebView.getScrollY() == 0) { // 在webview的顶部 }it
要点3 经过手势去判断方向io
gestureLisenter = new SimpleOnGestureListener() { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { CommUtil.logD(TAG, "onScroll"); try { float x = e2.getX() - e1.getX(); float y = e2.getY() - e1.getY(); float y_limit = 5; float y_abs = Math.abs(y); float x_abs = Math.abs(x); if (mWebView.getScrollY() == 0) { // 在webview的顶部 if (x_abs < y_abs) { if (y > y_limit || y < -y_limit) { if (y > 0) { // 下滑 CommUtil.logD(TAG, "in WebView top, onScroll up"); mActivity .getViewPager() .requestDisallowInterceptTouchEvent( false); return true; } } } } } catch (Exception e) { CommUtil.logE(TAG, e.toString()); } return false; } }; mGesture = new GestureDetector(gestureLisenter); mWebView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { CommUtil.logD(TAG, "onTouch"); if(mGesture.onTouchEvent(event)) { return true; } mActivity.getViewPager().requestDisallowInterceptTouchEvent( true); return false; } });
————————————————————————————————————————————————————
gestureLisenter = new SimpleOnGestureListener() { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { try { float x = e2.getX() - e1.getX(); float y = e2.getY() - e1.getY(); float y_limit = 5; float y_abs = Math.abs(y); float x_abs = Math.abs(x); int scrollY = svInfo.getScrollY(); int height = svInfo.getHeight(); int scrollViewMeasuredHeight = svInfo.getChildAt(0) .getMeasuredHeight(); if ((scrollY + height) == scrollViewMeasuredHeight) { //在底部 if (x_abs < y_abs) { if (y > y_limit || y < -y_limit) { if (y <= 0) { // 上滑 CommUtil.logD(TAG, "in ScrollView bottom, onScroll up"); mActivity.getViewPager() .requestDisallowInterceptTouchEvent( false); return true; } } } } } catch (Exception e) { CommUtil.logE(TAG, e.toString()); } return false; } }; mGesture = new GestureDetector(gestureLisenter); svInfo.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { CommUtil.logD(TAG, "onTouch"); if( mGesture.onTouchEvent(event)) { return true; } mActivity.getViewPager().requestDisallowInterceptTouchEvent( true); return false; } });