11

したがって、メインの ViewPager を持つアクティビティがあり、ViewPager の内部には各ページのコンテンツ全体が ScrollView としてあり、その ScrollView の内部には別の ViewPager があります。

これは奇妙に聞こえるかもしれませんが、基本的に外側の ViewPager にはニュース記事が含まれており、記事が長いため ScrollView があり、ScrollView 内には複数のサムネイル/画像があり、それらをスワイプすることもできます。

タッチ イベントのインターセプトが異なるいくつかのカスタム ViewPager を試してみましたが、完全に取得できないようです。ScrollView の垂直スクロールがその領域で機能しないようにすべてのタッチ イベントを完全に吸収するか、内側のタッチ イベントを水平方向にスクロールさせるのが非常に難しい/困難になります。

誰にも完璧な解決策がありますか?

4

1 に答える 1

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

最も外側の 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);
}
}
于 2013-06-12T15:25:02.323 に答える