繁体   English   中英

Viewpager里面的Viewpager滚动问题

[英]Viewpager inside Viewpager Scroll Issue

在我的主要活动中,我有一个水平 viewpager。 在viewpager 的一个片段中,我有另一个垂直viewpager。 两者都工作正常。 但是对于水平 viewpager,我需要从屏幕边缘滚动。 但我希望它可以从屏幕的任何地方滚动。

我的水平 viewpager 设置:

viewPager = (ViewPager) findViewById(R.id.viewpager);
        adapterViewPager = new HorizontalViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapterViewPager);
        viewPager.setCurrentItem(1);

水平 viewpager 适配器:

public class HorizontalViewPagerAdapter extends FragmentPagerAdapter {
    private static int NUM_ITEMS = 3;

    public HorizontalViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return MoreFragment.newInstance("Fragment MoreFragment", "HA HA HA");
            case 1:
                return NewsFragment.newInstance("Fragment 1", "HA HA HA");
            case 2:
                return WebViewFragment.newInstance("Fragment Webview", "HA HA HA");
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "Tab " + position;
    }
}

在我的新闻片段中,我有另一个 viewpager。

viewPager = view.findViewById(R.id.shortpager);
        adapterViewPager = new VerticalPagerAdapter(getActivity().getSupportFragmentManager(), newsList);
        viewPager.setAdapter(adapterViewPager);

我的垂直 viewpager 类:

public class VerticalViewPager extends ViewPager {

    public VerticalViewPager(Context context) {
        super(context);
        init();
    }

    public VerticalViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        // The majority of the magic happens here
        setPageTransformer(true, new VerticalPageTransformer());
        // The easiest way to get rid of the overscroll drawing that happens on the left and right
        setOverScrollMode(OVER_SCROLL_NEVER);
    }

    /**
     * Swaps the X and Y coordinates of your touch event.
     */
    private MotionEvent swapXY(MotionEvent ev) {
        float width = getWidth();
        float height = getHeight();

        float newX = (ev.getY() / height) * width;
        float newY = (ev.getX() / width) * height;

        ev.setLocation(newX, newY);

        return ev;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev){
        boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
        swapXY(ev); // return touch coordinates to original reference frame for any child views
        return intercepted;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return super.onTouchEvent(swapXY(ev));
    }

    private class VerticalPageTransformer implements ViewPager.PageTransformer {
        private static final float MIN_SCALE = 0.75f;

        @Override
        public void transformPage(View view, float position) {

            if (position <= -1) { // [-Infinity,-1)
                // This page is way off-screen to the left.
                view.setAlpha(0);

            } else if (position <= 0) { // [-1,0]
                // Use the default slide transition when moving to the left/top page
                view.setAlpha(1);
                ViewCompat.setElevation(view, 1);
                // Counteract the default slide transition
                view.setTranslationX(view.getWidth() * -position);
                view.setTranslationY(0);

                //set Y position to swipe in from top
                float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
                view.setScaleX(scaleFactor);
                view.setScaleY(scaleFactor);

            } else if (position <= 1) { // [0,1]
                view.setAlpha(1);
                ViewCompat.setElevation(view, 2);

                // Counteract the default slide transition
                view.setTranslationX(view.getWidth() * -position);
                view.setTranslationY(position * view.getHeight());

                // Scale the page down (between MIN_SCALE and 1)
                view.setScaleX(1);
                view.setScaleY(1);

            } else { // (1,+Infinity]
                // This page is way off-screen to the right.
                view.setAlpha(0);
            }

        }
    }

}

垂直取景器适配器:

public class VerticalPagerAdapter extends FragmentPagerAdapter {
    private static int NUM_ITEMS = 3;
    private final ArrayList<News> newsList;

    public VerticalPagerAdapter(FragmentManager fm, ArrayList<News> newsList) {
        super(fm);
        this.newsList = newsList;
    }

    @Override
    public Fragment getItem(int position) {
        return ShortFragment.newInstance("Fragment 1", "HA HA HA", newsList.get(position));
    }

    @Override
    public int getCount() {
        return this.newsList.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "Tab " + position;
    }
}

垂直 viewpager 平滑滚动。 目前对于水平 viewpager,我必须从屏幕边缘滚动。 但我需要让它像垂直滚动一样从屏幕的任何地方滚动。

您的代码问题是您的VerticalViewPager

如果你注意到代码,

@Override
public boolean onInterceptTouchEvent(MotionEvent ev){
    boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
    swapXY(ev); // return touch coordinates to original reference frame for any child views
    return intercepted;
}

第 1 步,用交换的手势调用 super。
第 2 步,使用当前手势在垂直视图寻呼机上执行操作。

如果您特别看到评论, // return touch coordinates to original reference frame for any child views这清楚地表明手势首先被子// return touch coordinates to original reference frame for any child views使用。

因此,在您的垂直视图寻呼机中,由于您正在交换手势,因此即使在将其传递给父级之前,它也会消耗 Horizo​​ntal Gesture。 这就是为什么您的水平视图寻呼机没有得到手势的原因。

如果您正在使用具有任何冲突手势实现(如 ScrollView、Lists、RecyclerView、ViewPager 等)的 Vertical View Pager,请使用以下链接中的那个。 它已被弃用,但适用于所有手势冲突视图。

https://github.com/kaelaela/VerticalViewPager

我遇到了这个问题,我通过将 viewpager 包装在 Scrollview 中解决了它

<ScrollView
            android:id="@+id/nested_scroll"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <androidx.viewpager2.widget.ViewPager2
                android:id="@+id/view_pager"
                android:nestedScrollingEnabled="false"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </ScrollView>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM