仿淘宝的商品详情拖动,ViewPager和ScrollView WebView的滑动冲突

仿淘宝的商品详情拖动遇到的问题。 使用结构就是DirectionalViewPager 嵌套了(1)ScrollView (2)WebView 输入图片说明

情况: 竖直方向的ViewPager DirectionalViewPager 嵌套了(1)ScrollView (2)WebView 出现滑动冲突

实现目标: (1)在ScrollView滑动到底部时,继续下拉触发DirectionalViewPager的滑动切换 (2)在WebView 滑动到顶端时,继续上拉触发DirectionalViewPager的滑动切换

利用void android.view.ViewGroup.requestDisallowInterceptTouchEvent(boolean disallowIntercept)方法 在子控件上通知外层的ViewPager进行事件拦截和 不拦截

要点1 判断ScrollView在底部

int scrollY = svInfo.getScrollY(); int height = svInfo.getHeight(); int scrollViewMeasuredHeight = svInfo.getChildAt(0) .getMeasuredHeight();

if ((scrollY + height) == scrollViewMeasuredHeight) { //在底部 }

要点2 判断WebView在顶部

if (mWebView.getScrollY() == 0) { // 在webview的顶部 }

要点3 通过手势去判断方向

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;
}

		});

猜你喜欢

转载自my.oschina.net/u/1446823/blog/500154