仿淘宝的商品详情拖动遇到的问题。 使用结构就是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;
}
});