在ScrollViews中使用带有ViewPagers的ScrollViews的Android ViewPager

egf*_*nor 11 android scrollview android-viewpager

所以我的活动有一个主ViewPager,在ViewPager里面,每个页面都有一个ScrollView的内容,在ScrollView内部还有另一个ViewPager.

这可能听起来很疯狂,但基本上外部ViewPager包含新闻文章,文章很长,所以有一个ScrollView,在ScrollView内部有多个缩略图/图片,他们也可以刷过.

我尝试过一些不同的自定义ViewPagers,它们具有不同的触摸事件拦截功能但似乎无法完美呈现.它要么完全吸收所有触摸事件,要么ScrollView的垂直滚动在该区域不起作用,否则将使内部水平滚动非常敏感/困难.

有人有完美的解决方案吗?

egf*_*nor 12

如果有人想知道我的解决方案:

public class CustomScrollView extends ScrollView {
private GestureDetector mGestureDetector;
View.OnTouchListener mGestureListener;

public CustomScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mGestureDetector = new GestureDetector(context, new YScrollDetector());
    setFadingEdgeLength(0);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return super.onInterceptTouchEvent(ev)
            && mGestureDetector.onTouchEvent(ev);
}

// Return false if we're scrolling in the x direction
class YScrollDetector extends SimpleOnGestureListener {
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
            float distanceX, float distanceY) {
        if (Math.abs(distanceY) > Math.abs(distanceX)) {
            return true;
        }
        return false;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

最外层的ViewPager是:

public class NestingViewPager extends ViewPager {

public NestingViewPager(final Context context, final AttributeSet attrs) {
    super(context, attrs);
}

public NestingViewPager(final Context context) {
    super(context);
}

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
    if (v != this && v instanceof ViewPager) {
        return true;
    }
    return super.canScroll(v, checkV, dx, x, y);
}
}
Run Code Online (Sandbox Code Playgroud)