Viewpager внутри Проблема прокрутки Viewpager - PullRequest
0 голосов
/ 07 июня 2018

в моей основной деятельности у меня есть горизонтальный viewpager.Внутри одного фрагмента окна просмотра у меня есть другой вертикальный виджет.Оба отлично работают.Но для горизонтального видового пейджера мне нужно прокрутить экран от края экрана.Но я хочу, чтобы его прокручивали из любой точки экрана.

мои горизонтальные настройки просмотра:

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

горизонтальный адаптер просмотра:

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 = view.findViewById(R.id.shortpager);
        adapterViewPager = new VerticalPagerAdapter(getActivity().getSupportFragmentManager(), newsList);
        viewPager.setAdapter(adapterViewPager);

Мой класс вертикального просмотра:

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

Вертикальный просмотрщикпрокручивается плавноВ настоящее время для горизонтального просмотра, я должен прокрутить от края экрана.Но мне нужно сделать так, чтобы он прокручивался как вертикальный из любой точки экрана.

1 Ответ

0 голосов
/ 07 июня 2018

Проблема с вашим кодом - ваш 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, Вызовите супер с измененным жестом.
Шаг-2,Выполните действия с пейджером вертикального обзора с помощью текущего жеста.

И если вы специально видите комментарий, // return touch coordinates to original reference frame for any child views это ясно говорит о том, что жест сначала используется дочерним элементом.

То есть в вашем пейджере вертикального просмотратак как вы меняете жесты, он потребляет горизонтальный жест еще до того, как передать его родителю.Вот почему ваш пейджер горизонтального просмотра не получает жест.

Если вы используете пейджер вертикального просмотра с любой противоречивой реализацией жестов, такой как ScrollView, Lists, RecyclerView, ViewPager и т. Д., Используйте тот, который приведен в ссылке ниже.Он устарел, но работает со всеми видами, противоречащими жестам.

https://github.com/kaelaela/VerticalViewPager

...