Scorrimento direzione in ViewPager

Ho un'applicazione Android che utilizza ViewPager e FragmentStatePagerAdapter. Devo tuttavia aggiungere una nuova funzionalità in cui devo conoscere la direzione di scorrimento per passare da una vista di frammento a un'altra, a sinistra oa destra. (cioè, quando scorgo a sinistra, faccio una cosa e quando faccio un giro, faccio qualcos'altro).

Si prega di notare, non ho bisogno che gli events avvengano DOPO che lo scorrimento è finito. Devo fare quegli events quando si verifica lo scorrimento. Ho pensato di utilizzare setOnPageChangeListener() ma non mi dice di scorrimento. Puoi consigliarmi per favore su come capire la direzione di scorrimento?

  • (ActionBar) Tabs + Pager + detail Frammenti all'interno del contenitore ViewPager
  • Come generare javadoc per la libreria android quando ha dependencies che sono anche biblioteche?
  • L'applicazione si blocca dopo aver scattato più immagini dalla camera Android
  • Come posso modificare il colore del text del button di dialogo predefinito in android 5?
  • Ottieni il nome della località dalle coordinate recuperate
  • Come si utilizza MediaControllerCompat per controllare il lettore corrente?
  • Grazie.

  • Android: Possibile connettere il bluetooth a sé?
  • OpenGL + OpenCV aumenta la realtà su Android
  • Android Studio: escludi il file di risorse nelle risorse sourceSets
  • Come impostare il timer Android?
  • Imansible avviare l'intento di servizio
  • Come avviare un'attività da una window di dialogo in Android
  • 7 Solutions collect form web for “Scorrimento direzione in ViewPager”

    Date un'occhiata al onPageSelected(int position) di ViewPager.OnPageChangeListener . La position fornisce l'indice della pagina appena selezionata. Se si tiene una traccia dell'indice di pagina corrente, è ansible confrontarla con l'indice di position per get la direzione sinistra / destra dello scorrimento.

    Ora che si menziona OnPageChangeListener non aiuta, considerare il onInterceptTouchEvent (MotionEvent ev) di ViewPager . Prendi in considerazione l'azione ACTION_DOWN, ACTION_MOVE e ACTION_UP di MotionEvent. Spero che questo ti aiuti.

    Forse puoi creare un ascoltatore come questo:

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

    Mi sono imbattuto in questo problema e ho bisogno di sapere la direzione dello scorrimento come stava succedendo per evitare che si muovesse in una certa direzione. Ecco come ho risolto il mio problema, spero che sia utile a qualcuno. Ho trovato tutti gli esempi precedenti inefficienti per quello che avevo bisogno.

    Se si subclassi il ViewPager, è ansible rispondere ai onInterceptTouchEvent(MotionEvent event) e 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); } 

    Ecco il metodo che viene chiamato per determinare la direzione dell'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; } } 

    In realtà è ansible trovare la direzione di utilizzare i parametri di onPageScrolled .
    L'ascoltatore seguente è impostato per mostrare un messaggio di registro una volta per direzione di cambio di frammento netto (sinistra se i frammenti di sinistra si rivolgono, centro se nessun frammento si rivela, a destra se viene visualizzato il frammento di destra).
    Le variables di class, devono tenere traccia

      // -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; 

    L'ascoltatore

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

    Questo è abbastanza semplice con l'introduzione di una variabile di istanza per tenere traccia della pagina corrente.

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

    È ansible aggiungere un OnPageChangeListner al ViewPager e fare qualcosa di simile:

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

    È ansible utilizzare setOnPageChangeListener() e implementare correttamente onPageScrolled(int position, float positionOffset, int positionOffsetPixels) .

    È ansible rilevare la direzione per posizioneOffset e posizione variabile:

     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(position == mCurrentPosition && positionOffset > 0) { //swipe right } else if (positionOffset > 0) { //swipe left } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.