Cómo saber viewpager es desplazarse a la izquierda oa la derecha?

Estoy usando ViewPager (biblioteca de la ayuda). Quiero saber cada vez que el ViewPager cambia la página visible, se desplaza hacia la izquierda o la derecha.

Por favor, dame una solución. Cualquier recomendación es bienvenido también.

Gracias

Establece setOnPageChangeListener en tu ViewPager

y en

 @Override public void onPageSelected(int arg0) { if(lastPage>arg0) {//User Move to left} else(lastPage<arg0) {//User Move to right} lastPage=arg0 } 

No es una solución perfecta, pero aquí hay una manera de comprobar la dirección de desplazamiento cuando empiece a deslizar:

 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: hay un enfoque más elegante que implica usar un ViewPager.PageTransformer y comprobar sus intervalos de posición:

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

Puede obtener más información de: Uso de ViewPager para diapositivas de pantalla

  1. Esta es mi solución simple en el método onPageScrolled () de ViewPager.OnPageChangeListener :

Introduzca aquí la descripción de la imagen

La misma solución que GuilhE con una corrección menor para evitar falsos positivos cuando la paginación se queda (pasar a la derecha) en la primera página (no hay más páginas a la izquierda) en ViewPager. Simplemente hace una comprobación adicional para ver si el golpe se ha movido en absoluto.

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

Utilice la interfaz ViewPager.OnPageChangeListener . Puede utilizar el argumento de posición que se pasa a onPageSelected y compararlo con el valor anterior para averiguar en qué dirección se desplazó el ViewPager .

Puede mantener la variable miembro de la clase para guardar la última página visitada.

 private int mLastVisitedPageIndex = 0; 

A continuación, utilice la siguiente función para comprobar la dirección

 @Override public void onPageSelected(int i) { boolean isMovingForward = mLastVisitedPageIndex < i?true:false; //Use isMovingForward variable anywhere now mLastVisitedPageIndex = i; } 

usa eso

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

He resuelto el problema con esta implementación. Espero eso ayude.

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

También podemos hacer esto usando un Viewpager personalizado, que puede contener métodos swipeLeft () y swipeRight () y su método onTouchEvent (evento MotionEvent) puede contener ACTION_MOVE y ACTION_CANCEL.

// Este puede ser el código si es útil.

Public class SwiperViewPager extends ViewPager {

 SwiperListener mSwiperListener; private float downX; private float downY; private boolean isTouchCaptured; private float upX1; private float upY1; private float upX2; private float upY2; public SwiperViewPager(Context context) { super(context); } public SwiperViewPager(Context context, AttributeSet attrs) { super(context, attrs); } private float x1, x2; static final int min_distance = 20; boolean eventSent = false; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: { downX = event.getX(); downY = event.getY(); if (!isTouchCaptured) { upX1 = event.getX(); upY1 = event.getY(); isTouchCaptured = true; } else { upX2 = event.getX(); upY2 = event.getY(); float deltaX = upX1 - upX2; float deltaY = upY1 - upY2; //HORIZONTAL SCROLL if (Math.abs(deltaX) > Math.abs(deltaY)) { if (Math.abs(deltaX) > min_distance) { // left or right if (deltaX < 0) { if(!eventSent && mSwiperListener!=null){ mSwiperListener.onLeftSwipe(); eventSent = true; } } if (deltaX > 0) { if(!eventSent && mSwiperListener!=null){ if(mSwiperListener.onRightSwipe()){ eventSent = true; return false; } } } } else { //not long enough swipe... } } //VERTICAL SCROLL else { if (Math.abs(deltaY) > min_distance) { // top or down if (deltaY < 0) { } if (deltaY > 0) { } } else { //not long enough swipe... } } } } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL:{ isTouchCaptured = false; eventSent = false; } } return super.onTouchEvent(event); } public void setmSwiperListener(SwiperListener mSwiperListener) { this.mSwiperListener = mSwiperListener; } public static interface SwiperListener { public boolean onLeftSwipe(); public boolean onRightSwipe(); } 

}

 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; } } }); 
 private float sumPositionAndPositionOffset; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { boolean isSwipeToLeft = position + positionOffset > sumPositionAndPositionOffset; sumPositionAndPositionOffset = position + positionOffset; } 
 pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(position == pager.getCurrentItem()){ // Move Right } else{ // Move Left } } 
  • Android FragmentPagerAdapter con LoaderManager
  • Fragmentos en viewpager, no se encontró error de vista
  • Cómo obtener acceso a mi botón en una de mis páginas de viewpager?
  • ViewPager se desplaza programáticamente
  • El paginador de vista de Android cambia las páginas automáticamente después de unos segundos
  • Uso del botón backstack y back en viewpager
  • Ocultar / mostrar la barra de acción contextual mediante programación
  • Android cuando ViewPager inserta como Child get error android.view.ViewGroup.jumpDrawablesToCurrentState (ViewGroup.java:5035)
  • Guardar el estado de WebView y restaurar en ANDROID
  • Desafío: Animación personalizada de ViewPager. Cambiar la altura de los elementos elegidos (Ver doble)
  • Ver indicador de buscapersonas Jake Wharton
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.