Desplazamiento Dirección en ViewPager

Tengo una aplicación de Android que utiliza ViewPager y FragmentStatePagerAdapter. Sin embargo, tengo que añadir una nueva función en la que tengo que saber la dirección de desplazamiento para pasar de una vista de fragmento a otra, a la izquierda oa la derecha. (Es decir, cuando deslizo a la izquierda, haría una cosa, y cuando golpee a la derecha haría otra cosa).

Tenga en cuenta que no necesito que los eventos ocurran DESPUÉS de que el golpe haya terminado. Tengo que hacer esos eventos como el golpe se produce. Pensé en usar setOnPageChangeListener() pero no me dice la dirección del setOnPageChangeListener() . ¿Puede usted aconsejarme por favor sobre cómo averiguar la dirección de deslizamiento?

Gracias.

7 Solutions collect form web for “Desplazamiento Dirección en ViewPager”

Eche un vistazo al onPageSelected(int position) de ViewPager.OnPageChangeListener . La position da el índice de la página recién seleccionada. Si mantiene una pista del índice de la página actual, puede compararla con el índice de position para obtener la dirección izquierda / derecha del desplazamiento.

Ahora que menciona OnPageChangeListener no ayuda, considere el onInterceptTouchEvent (MotionEvent ev) de ViewPager . Tome en cuenta ACTION_DOWN, ACTION_MOVE y ACTION_UP de MotionEvent. Espero que esto ayude.

Tal vez usted puede construir un oyente como este:

 buttonIcons.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(final View v, final MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = event.getX(); return true; case MotionEvent.ACTION_UP: upX = event.getX(); final float deltaX = downX - upX; if (deltaX > 0 && deltaX > SWIPE_MIN_DISTANCE) { final Animation loadInAnimation = AnimationUtils .loadAnimation( activity.this, R.anim.slide_in_right); final Animation loadOutAnimation = AnimationUtils .loadAnimation( activity.this, R.anim.slide_out_left); viewFlipper.setInAnimation(loadInAnimation); viewFlipper.setOutAnimation(loadOutAnimation); viewFlipper.showPrevious(); startSaveButtonAnimation(); } if (deltaX < 0 && -deltaX > SWIPE_MIN_DISTANCE) { final Animation loadInAnimation = AnimationUtils .loadAnimation( activity.this, R.anim.slide_in_left); final Animation loadOutAnimation = AnimationUtils .loadAnimation( activity.this, R.anim.slide_out_right); viewFlipper.setInAnimation(loadInAnimation); viewFlipper.setOutAnimation(loadOutAnimation); viewFlipper.showNext(); startSaveButtonAnimation(); } return true; } return false; } }); 

Me encontré con este problema y la necesidad de saber la dirección del golpe como lo estaba sucediendo con el fin de evitar el deslizamiento en una dirección determinada. He aquí cómo he resuelto mi problema, espero que sea útil para alguien. Encontré todos los ejemplos anteriores ineficientes para lo que necesitaba.

Si subclases su ViewPager, puede responder a los onInterceptTouchEvent(MotionEvent event) y onTouchEvent(MotionEvent event) del ViewPager

 @Override public boolean onInterceptTouchEvent(MotionEvent event) { boolean wasSwipeToRight = this.wasSwipeToRightEvent(event)); // Do what you want here with left/right swipe return super.onInterceptTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { boolean wasSwipeToRight = this.wasSwipeToRightEvent(event)); // Do what you want here with left/right swipe return super.onTouchEvent(event); } 

Aquí está el método que se llama para determinar la dirección del evento.

 // Stores the starting X position of the ACTION_DOWN event float downX; /** * Checks the X position value of the event and compares it to * previous MotionEvents. Returns a true/false value based on if the * event was an swipe to the right or a swipe to the left. * * @param event - Motion Event triggered by the ViewPager * @return - True if the swipe was from left to right. False otherwise */ private boolean wasSwipeToRightEvent(MotionEvent event){ switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = event.getX(); return false; case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: return downX - event.getX() > 0; default: return false; } } 

Usted realmente puede encontrar la dirección de usar parámetros de onPageScrolled .
El siguiente oyente está configurado para mostrar el mensaje de registro una vez por dirección de cambio de fragmento neto (izquierda si los fragmentos de izquierda revelan, centro si ningún fragmento revela, derecha si el fragmento de derecha revela).
Variables de clase, necesidad de mantener un seguimiento

  // -1 - left, 0 - center, 1 - right private int scroll = 0; // set only on `onPageSelected` use it in `onPageScrolled` // if currentPage < page - we swipe from left to right // if currentPage == page - we swipe from right to left or centered private int currentPage = 0; // if currentPage < page offset goes from `screen width` to `0` // as you reveal right fragment. // if currentPage == page , offset goes from `0` to `screen width` // as you reveal right fragment // You can use it to see //if user continue to reveal next fragment or moves it back private int currentOffset = 0; // behaves similar to offset in range `[0..1)` private float currentScale = 0; 

El oyente

 pager.addOnPageChangeListener( new OnPageChangeListener(){ @Override public void onPageScrolled(int page, float scale, int offset){ if(scale != 0f && offset > 10){ if(currentOffset > offset && currentScale > scale && (page + 1) == currentPage){ if(scroll != -1){ newImageSet = true; scroll = -1; Log.e("scroll", "left"); } } else if(currentOffset < offset && currentScale < scale && page == currentPage){ if(scroll != 1){ newImageSet = true; scroll = 1; Log.e("scroll", "right"); } } currentOffset = offset; currentScale = scale; } @Override public void onPageSelected(int i){ Log.e("scroll","centre"); // we are centerd, reset class variables currentPage = i; currentScale = 0; currentOffset = 0; scroll = 0; } @Override public void onPageScrollStateChanged(int i){ } } ); 

Esto es bastante simple con la introducción de una variable de la instancia para no perder de vista la página actual.

 public class MyActivity extends Activity implements ViewPager.OnPageChangeListener { private ViewPager viewPager; private int currentPosition; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Do trivial stuff . . . viewPager.setOnClickListener(this); // doesnt have to be in onCreate } @Override public void onPageSelected(int position) { if(currentPosition < position) { // handle swipe LEFT } else if(currentPosition > position){ // handle swipe RIGHT } currentPosition = position; // Update current position } } 

Puede agregar un OnPageChangeListner al ViewPager y hacer algo como esto:

 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { float tempPositionOffset = 0; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position == 0) { if (tempPositionOffset < positionOffset) { Log.d("eric", "scrolling left ..."); } else { Log.d("eric", "scrolling right ..."); } tempPositionOffset = positionOffset; Log.d("eric", "position " + position + "; " + " positionOffset " + positionOffset + "; " + " positionOffsetPixels " + positionOffsetPixels + ";"); } } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); 

Puede utilizar setOnPageChangeListener() e implementar correctamente onPageScrolled(int position, float positionOffset, int positionOffsetPixels) .

Puede detectar la dirección por posiciónOffset y posición variable:

 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(position == mCurrentPosition && positionOffset > 0) { //swipe right } else if (positionOffset > 0) { //swipe left } } 
  • Implementación de la atracción de Chris Banes para actualizar junto con desplazamiento horizontal en la vista de lista
  • SwipeListView sólo un elemento abierto a la vez
  • Vista de lista de Android Giros de derecha / izquierda como registros de llamadas
  • Cómo manejar el evento táctil para la vista secundaria en la vista principal
  • Desplazamiento no funciona en android ViewPager con FragmentPagerAdapter
  • Cómo detectar el gesto de desplazamiento de la vista web con el zoom multitáctil habilitado con una aleta
  • Cómo poner ViewPager verticalmente swiped en un ViewPager horizontalmente barrido
  • Android - Detección de gestos (deslizar hacia arriba / hacia abajo) en una vista determinada
  • Cómo buscar Android ViewFlipper Ejemplo con varias WebViews
  • Android cómo agregar el gesto de deslizamiento en LinearLayout sin onDown true
  • No se puede implementar el deslizamiento + comportamiento de desplazamiento en el panel deslizante con ListView en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.