Diferenciación entre desplazamiento de usuario y cambio de página de programación en ViewPager

Tengo un android.support.v4.view.ViewPager en mi aplicación y me gustaría diferenciar entre una programación de inicio de desplazamiento suave y un usuario iniciado toque de desplazamiento.

He ViewPager.OnPageChangeListener un vistazo a ViewPager.OnPageChangeListener y creo que la respuesta puede mentir allí, pero no estoy seguro de cómo.

Aceptar, por lo que resulta que tenía razón sobre la respuesta que se encuentra en ViewPager.onPageChangeListener . En particular reside en el uso de onPageScrollStateChanged(int state) . Esencialmente hay tres estados que una página en un ViewPager puede estar en:

  1. Arrastre: Indica que el paginador está siendo arrastrado por el usuario.
  2. Inactivo: Indica que el buscapersonas está en un estado inactivo, establecido.
  3. Asentamiento: Indica que el buscapersonas está en el proceso de asentamiento a una posición final.

Por lo tanto, el estado de arrastre sólo se produce cuando la página actual se está arrastrando físicamente por el usuario. Por lo tanto, cuando el usuario ha barrido una página los estados se producen en el siguiente orden: Arrastre -> Asentamiento -> Inactivo. Ahora, el onPageSelected(int position) se llama entre los estados "Settling" y "Idle". Por lo tanto, con el fin de determinar si o no un cambio de página fue causado por un desplazamiento del usuario sólo hay que comprobar que el estado anterior era "arrastrar" y que el estado actual es "Asentamiento". A continuación, puede mantener una variable boolean para rastrear si el cambio de página fue iniciado por el usuario o no y lo comprueba en su onPageSelected(int position) .

Aquí está mi método onPageScrollStateChanged

 public void onPageScrollStateChanged(int state) { if (previousState == ViewPager.SCROLL_STATE_DRAGGING && state == ViewPager.SCROLL_STATE_SETTLING) userScrollChange = true; else if (previousState == ViewPager.SCROLL_STATE_SETTLING && state == ViewPager.SCROLL_STATE_IDLE) userScrollChange = false; previousState = state; } 

Las declaraciones if y else if no necesitan ser tan explícitas, pero lo hice por claridad.

Tiene razón al usar ViewPager.OnPageChangeListener :

 @Override public void onPageSelected(int arg0) { // programmatically-initiated } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { // user-initiated touch scroll } 

Como alternativa, puede utilizar banderolas booleanas para diferenciar entre programmatically-initiated smooth scroll and a user-initiated touch scroll . Por ejemplo, si utiliza setCurrentItem(int item) para cambiar la página mediante programación, intente:

 boolean progChange = false; .... .... .... progChange = true; setCurrentItem(somePageId); // Set progChange = true every time .... .... .... 

Dentro de su ViewPager.OnPageChangeListener :

 @Override public void onPageSelected(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { if (progChange) { // programmatically-initiated } else { // user-initiated touch scroll } // Set progChange to false; progChange = false; } @Override public void onPageScrollStateChanged(int arg0) { } 
  • Viewpager no se desplaza en el diseño del coordinador
  • Detenga ViewPagers dentro de ListView de restablecer
  • Reemplazar un fragmento con otro en ViewPager
  • ViewPager no carga correctamente la página central
  • ¿Cómo puedo implementar el desplazamiento horizontal sin utilizar la biblioteca de soporte?
  • Cómo colocar el botón de acción flotante exclusivamente en un fragmento sólo en el diseño de la pestaña
  • Pestañas de Acción
  • Nullpointerexception en dispatchDraw con ViewPager en fragmento anidado con PageTransformer
  • Android ViewPager que genera una excepción IndexOutOfBounds al configurar el elemento / página actual
  • Uso de la animación en un ViewPager y setFillAfter
  • Implementación de desplazamiento circular en PagerAdapter
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.