ViewPager desactiva el desplazamiento a una dirección determinada

Quiero desactivar el deslizamiento, pero sólo a la derecha. Encontré una solución de trabajo en esta respuesta. Desafortunadamente, esto copia toda la fuente de ViewPager para lograr la meta. ¿Hay algún método simplemente heredando la clase existente y no duplicando?

7 Solutions collect form web for “ViewPager desactiva el desplazamiento a una dirección determinada”

No estoy seguro de que esto sea exactamente lo que necesitas: necesité un viewpager para un asistente con una página máx. Que el usuario no pueda pasar.

Al final la solución estaba en el adaptador. Cambié la cuenta del PagerAdapter y de esta manera bloquea al usuario de pasar la página máxima:

 @Override public int getCount() { return mProgress; //max page + 1 } 

Cuando el usuario avanza a la siguiente página:

 private void setWizardProgress(int progress) { if(progress > mProgress) { mProgress = progress; mWizardPagerAdapter.notifyDataSetChanged(); } } 

De esta manera, cuando el usuario está en la página máxima, no puede desplazarse hacia la derecha.

Aquí está trabajando ViewPager clase con la posibilidad de desactivar cualquier dirección de paginación. Echa un vistazo a toda la respuesta aquí .

 public class CustomViewPager extends ViewPager { private float initialXValue; private SwipeDirection direction; public CustomViewPager(Context context, AttributeSet attrs) { super(context, attrs); this.direction = SwipeDirection.all; } @Override public boolean onTouchEvent(MotionEvent event) { if (this.IsSwipeAllowed(event)) { return super.onTouchEvent(event); } return false; } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (this.IsSwipeAllowed(event)) { return super.onInterceptTouchEvent(event); } return false; } private boolean IsSwipeAllowed(MotionEvent event) { if(this.direction == SwipeDirection.all) return true; if(direction == SwipeDirection.none )//disable any swipe return false; if(event.getAction()==MotionEvent.ACTION_DOWN) { initialXValue = event.getX(); return true; } if(event.getAction()==MotionEvent.ACTION_MOVE) { try { float diffX = event.getX() - initialXValue; if (diffX > 0 && direction == SwipeDirection.right ) { // swipe from left to right detected return false; }else if (diffX < 0 && direction == SwipeDirection.left ) { // swipe from right to left detected return false; } } catch (Exception exception) { exception.printStackTrace(); } } return true; } public void setAllowedSwipeDirection(SwipeDirection direction) { this.direction = direction; } 

Otra forma sencilla es usar setCurrentItem () para desplazarse de nuevo a la diapositiva deseada si pulsa una determinada posición. Por ejemplo, esto sólo permitirá el swiping hacia adelante:

 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { if(position < mProgress) { mViewPager.setCurrentItem(mProgress, true); } else { mProgress = position; } } @Override public void onPageScrollStateChanged(int state) {} }); 

O si desea tener una diapositiva máxima:

 if(position > 4) { mViewPager.setCurrentItem(4, true); } 

Esta solución técnicamente no desactivará por completo el golpe, ya que todavía verá una pequeña porción de la diapositiva no permitida cuando realice su movimiento de desplazamiento. Pero para algunas aplicaciones esto puede ser preferido.

Usted puede intentar seguir:

Paso 1: Cree una nueva clase personalizada, diga " CustomViewPager ". La clase hereda de " ViewPager " e incluye un nuevo método personalizado llamado " setPagingEnabled " con un propósito de habilitar / deshabilitar el swiping, dependiendo del requisito.

Paso 2: onTouchEvent dos métodos: " onTouchEvent " y " onInterceptTouchEvent ". Ambos devolverán " false " si la paginación se va a desactivar completamente.

Paso 3: Sustituya la etiqueta " ViewPager " en el archivo de diseño con la clase personalizada:

  <package_name.customviewpager android:id="@+id/customViewPager" android:layout_height="match_parent" android:layout_width="match_parent" /> 

Paso 4: CustomViewPager.java

  public class CustomViewPager extends ViewPager { private boolean enabled; public CustomViewPager(Context context, AttributeSet attrs) { super(context, attrs); this.enabled = true; } @Override public boolean onTouchEvent(MotionEvent event) { if (this.enabled && detectSwipeToRight(event)) { return super.onTouchEvent(event); } return false; } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (this.enabled && detectSwipeToRight(event)) { return super.onInterceptTouchEvent(event); } return false; } // To enable/disable swipe public void setPagingEnabled(boolean enabled) { this.enabled = enabled; } // Detects the direction of swipe. Right or left. // Returns true if swipe is in right direction public boolean detectSwipeToRight(MotionEvent event){ int initialXValue = 0; // as we have to detect swipe to right final int SWIPE_THRESHOLD = 100; // detect swipe boolean result = false; try { float diffX = event.getX() - initialXValue; if (Math.abs(diffX) > SWIPE_THRESHOLD ) { if (diffX > 0) { // swipe from left to right detected ie.SwipeRight result = false; } else { // swipe from right to left detected ie.SwipeLeft result = true; } } } catch (Exception exception) { exception.printStackTrace(); } return result; } } 
 private float initialXValue; @Override public boolean onTouchEvent(MotionEvent event) { if (this.mEnabled) { return super.onTouchEvent(event); } if(event.getAction()==MotionEvent.ACTION_DOWN){ initialXValue = event.getX(); }else if(event.getAction()==MotionEvent.ACTION_MOVE){ if(detectSwipeToRight(event)){ System.out.println("right swipe detected"); } } return true; } private boolean detectSwipeToRight(MotionEvent event) { final int SWIPE_THRESHOLD = 100; // detect swipe boolean result = false; try { float diffX = event.getX() - initialXValue; if (Math.abs(diffX) > SWIPE_THRESHOLD) { if (diffX < 0) { // swipe from right to left detected ie.SwipeLeft result = true; } } } catch (Exception exception) { exception.printStackTrace(); } return result; } 

Puede utilizar los métodos beginFakeDrag() y endFakeDrag() .

beginFakeDrag() cuando desee inhabilitar el swipe y endFakeDrag() si desea habilitar de nuevo.

Así: viewPager.beginFakeDrag();

Tienes que crear tu propia subclase ViewPager y anular la función canScrollHorizontally

http://developer.android.com/reference/android/support/v4/view/ViewPager.html#canScrollHorizontally(int)

  • ¿Cómo podemos crear un visor cilíndrico?
  • Texto diferente para cada imagen en el visor de imágenes
  • Problema de zoom con ViewPager y ImageView
  • Indicadores de flecha izquierda-derecha sobre un ViewPager
  • ViewPager Circular con menos de 4 visitas
  • La animación de ViewPager se desvanece en / fuera en lugar de la diapositiva
  • Establecer la página predeterminada de ViewPager en Android
  • La mejor manera de desactivar la paginación de ViewPager
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.