Pytanie Twórz widoki ViewPager z krótszym oporem


Czy istnieje sposób na to, aby pakiet pomocy ViewPager został przyciągnięty do następnej strony z krótszym przeciągnięciem? Domyślnym zachowaniem wydaje się być to, że nawet jeśli przeciągnę prawie 75% strona nadal będzie wracała do poprzedniej strony, kiedy odpuszczę. Chciałbym, aby próg przyciągania był krótszy, a zamiast tego wywołaj ViewPager na następną stronę.

Zauważ, że to zastosowało się do gestu przeciągania. Gwałtowny gest wymaga już znacznie krótszego gestu.


14
2018-06-26 11:19


pochodzenie




Odpowiedzi:


Możesz zrobić to ad-hoc, nie martwiąc się zbytnio o funkcje wewnętrzne ViewPagera, o ile chcesz zwiększyć strefę docelową:

private class MyPageChangeListener implements OnPageChangeListener {
    private float mLastPositionOffset = 0f;
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        if(positionOffset < mLastPositionOffset && positionOffset < 0.9) {
            mViewPager.setCurrentItem(position);
        } else if(positionOffset > mLastPositionOffset && positionOffset > 0.1) {
            mViewPager.setCurrentItem(position+1);
        }
        mLastPositionOffset = positionOffset;
    }
}

22
2018-06-26 14:05



Pracował jak urok. Dziękuję Ci! - Juhani
Dobry pomysł, chociaż wydaje mi się, że to trochę dziwne - astuetz


Wygląda na to, że te wartości są zakodowane w prywatnej metodzie, więc nie ma prostego sposobu na ich zastąpienie.

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/support/v4/view/ViewPager.java#2075


1
2018-06-26 13:33



Prawidłowo, ale wartości nie wynoszą 0,4 / 0,6 f (ponieważ są to skracacze). ja myśleć działa na 60% szerokości ViewPager dla obu kierunków. Rzut musi wynosić tylko 25 zanurzeń, z prędkością 400 dip / s. - Chris Banes
@ ChrisBanes Oczywiście masz rację, miałem tylko bardzo szybkie spojrzenie - dzięki! - astuetz


Oto mój kod używany w Librera Reader

public class MyViewPager extends ViewPager {

  public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        initMyScroller();
    }

    private void initMyScroller() {
        try {
            Class<?> viewpager = ViewPager.class;
            Field scroller = viewpager.getDeclaredField("mScroller");
            scroller.setAccessible(true);
            scroller.set(this, new MyScroller(getContext())); // my liner scroller

            Field mFlingDistance = viewpager.getDeclaredField("mFlingDistance");
            mFlingDistance.setAccessible(true);
            mFlingDistance.set(this, Dips.DP_10);//10 dip short drag

            Field mMinimumVelocity = viewpager.getDeclaredField("mMinimumVelocity");
            mMinimumVelocity.setAccessible(true);
            mMinimumVelocity.set(this, 0); //0 velocity

        } catch (Exception e) {
            LOG.e(e);
        }

    }

    public class MyScroller extends Scroller {
        public MyScroller(Context context) {
            super(context, new LinearInterpolator()); // my LinearInterpolator
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy, int duration) {
            super.startScroll(startX, startY, dx, dy, 175);//175 duration
        }
    }

 }

0
2018-03-12 13:20



Proszę nie zamieszczać identycznych odpowiedzi na wiele pytań. Napisz jedną dobrą odpowiedź, a następnie głosuj / oznacz, aby zamknąć pozostałe pytania jako duplikaty. Jeśli pytanie nie jest duplikatem, dopasuj swoje odpowiedzi do pytania. - Paul Roub