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.

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 } } 
  • Android: en el interruptor de desplazamiento entre Vistas / Actividades / Fragmentos
  • Necesita ayuda para implementar 47degree Android-SwipeListView
  • RecyclerView ItemTouchHelper borrar eliminar animación
  • SimpleOnGestureListener código no funciona en Android 2.2
  • Desplazamiento no funciona en android ViewPager con FragmentPagerAdapter
  • ¿Es posible producir una acción de deslizamiento continuo en la pantalla táctil, con adb, en Android?
  • Android de izquierda a derecha solamente
  • SwipeListView sólo un elemento abierto a la vez
  • ¿Cambiar la pestaña de desplazamiento / desplazamiento en combinación con ScrollView?
  • ¿Cómo implementar un gesto de deslizamiento entre fragmentos?
  • Simple gesto de desplazamiento a la actividad tutorial?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.