[Android] Comment savoir viewpager défile vers la gauche ou la droite?


Answers

Ce n'est pas une solution parfaite, mais voici un moyen de vérifier la direction du balayage lorsque vous commencez à glisser:

new ViewPager.OnPageChangeListener() {

            private static final float thresholdOffset = 0.5f;
            private boolean scrollStarted, checkDirection;

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                if (checkDirection) {
                    if (thresholdOffset > positionOffset) {
                        Log.i(C.TAG, "going left");
                    } else {
                        Log.i(C.TAG, "going right");
                    }
                    checkDirection = false;
                }
            }

            @Override
            public void onPageSelected(int position) {}

            @Override
            public void onPageScrollStateChanged(int state) {
                if (!scrollStarted && state == ViewPager.SCROLL_STATE_DRAGGING) {
                    scrollStarted = true;
                    checkDirection = true;
                } else {
                    scrollStarted = false;
                }
            }
        });


EDIT: il existe une approche plus élégante qui consiste à utiliser ViewPager.PageTransformer et à vérifier ses intervalles de position:

...
myViewPager.setPageTransformer(true, new PageTransformer());
...

public class PageTransformer implements ViewPager.PageTransformer {
    public void transformPage(View view, float position) {

        if (position < -1) { 
            // [-00,-1): the page is way off-screen to the left.
        } else if (position <= 1) { 
            // [-1,1]: the page is "centered"
        } else { 
            // (1,+00]: the page is way off-screen to the right.           
        }
    }
}

Vous pouvez en apprendre plus à l' aide de: Utilisation de ViewPager pour les diapositives d'écran

Question

J'utilise ViewPager (bibliothèque de support). Je veux savoir à chaque fois que le ViewPager change la page visible, il défile vers la gauche ou vers la droite.

S'il vous plaît donnez-moi une solution. Toute recommandation est la bienvenue aussi.

Merci




viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        private int mCurrentSelectedScreen;
        private int mNextSelectedScreen;
        private static final float thresholdOffset = 0.5f;
        private boolean scrollStarted=true, checkDirection=false;
        ArrayList<Integer> comp_ary=new ArrayList<Integer>();

        @Override
        public void onPageSelected(int arg0) {
        }

        @Override
        public void onPageScrolled(int position, float positionOffset,
                int positionOffsetPixels) {

        //Log.e("positionOffsetPixels : "+positionOffsetPixels, "positionOffset : "+positionOffset);
        comp_ary.add(positionOffsetPixels);
             if (checkDirection) {
                    if (comp_ary.get(2) < comp_ary.get(comp_ary.size()-1)) {

                        Log.e("going left", "going left");
                    } else
                        if (comp_ary.get(2) > comp_ary.get(comp_ary.size()-1))
                    {

                        Log.e("going right", "going right");
                    }
                    checkDirection = false;
                    comp_ary=new ArrayList<Integer>();
                }
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {




            if (!scrollStarted && arg0 == ViewPager.SCROLL_STATE_SETTLING) {
                scrollStarted = true;
                checkDirection = true;
            } else {
                scrollStarted = false;
            }


        }
    });



Utiliser ça

@Override
public void onPageSelected( int position )
{
    mCurrentFragmentPosition = position;
}
@Override
public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels )
{
    boolean isGoingToRightPage = position == mCurrentFragmentPosition;
    if(isGoingToRightPage)
    {
        // user is going to the right page
    }
    else
    {
        // user is going to the left page
    }
}



La même solution que GuilhE avec une correction mineure pour éviter d'obtenir des faux positifs lors de la mise en page gauche (glisser à droite) sur la première page (plus de pages à gauche) dans le ViewPager. Il effectue simplement une vérification supplémentaire pour voir si le balayage a effectivement bougé.

new ViewPager.OnPageChangeListener() {

  private static final float thresholdOffset = 0.5f;
  private static final int thresholdOffsetPixels = 1;
  private boolean scrollStarted, checkDirection;

  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    if (checkDirection) {
      if (thresholdOffset > positionOffset && positionOffsetPixels > thresholdOffsetPixels) {
        Log.i(C.TAG, "going left");
      } else {
        Log.i(C.TAG, "going right");
      }
    checkDirection = false;
  }
}

  @Override
  public void onPageSelected(int position) {}

  @Override
  public void onPageScrollStateChanged(int state) {
    if (!scrollStarted && state == ViewPager.SCROLL_STATE_DRAGGING) {
      scrollStarted = true;
      checkDirection = true;
    } else {
      scrollStarted = false;
    }
  }
 });



pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            if(position  == pager.getCurrentItem()){
                // Move Right
            }
            else{
                // Move Left
            }

        }



J'ai résolu le problème avec cette implémentation. J'espère que cela aide.

public static final float EPSILON= 0.001f;

@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {

    // initial position (positionOffset == 0)
    if (positionOffset < EPSILON) {
        mIsRight = positionOffset < 0.5;
        return;
    }

    // code here
    if (mIsRight) {
    } else {
    }
}