Cómo cambiar automáticamente entre las páginas de viewPager

Tengo una aplicación de Android que emplea un ViewPager con dos páginas. Cuando la actividad se muestra por primera vez, me gustaría presentar cada página al usuario para que sepan que pueden deslizar entre dos vistas. No he encontrado ningún documento que describa cómo hacerlo. Descubrí PageTransformations que sonaba prometedor pero que el usuario debe deslizar primero. Necesito que mis dos páginas se desplacen automáticamente tan pronto como se muestre la primera página en ViewPager. ¿cómo se puede lograr el resultado deseado?

Puede usar el Timer para este propósito. El siguiente código es autoexplicativo:

 // --------------------------------------------------------------------------- Timer timer; int page = 1; public void pageSwitcher(int seconds) { timer = new Timer(); // At this line a new Thread will be created timer.scheduleAtFixedRate(new RemindTask(), 0, seconds * 1000); // delay // in // milliseconds } // this is an inner class... class RemindTask extends TimerTask { @Override public void run() { // As the TimerTask run on a seprate thread from UI thread we have // to call runOnUiThread to do work on UI thread. runOnUiThread(new Runnable() { public void run() { if (page > 4) { // In my case the number of pages are 5 timer.cancel(); // Showing a toast for just testing purpose Toast.makeText(getApplicationContext(), "Timer stoped", Toast.LENGTH_LONG).show(); } else { mViewPager.setCurrentItem(page++); } } }); } } // --------------------------------------------------------------------------- 

Nota 1: asegúrese de llamar pageSwitcher método pageSwitcher después de configurar el método de creación de la aplicación viewPager correctamente en el método onCreate de su actividad.

Nota 2: viewPager deslizará cada vez que lo ejecute. Tienes que manejarlo de manera que pase por todas las páginas solo una vez (cuando el usuario está viendo viewPager primera vez)

Nota 3: Si además desea ralentizar la velocidad de desplazamiento de viewPager , puede seguir esta respuesta en StackOverflow.


Dime en los comentarios si eso no podría ayudarte …

La pregunta es vieja pero espero que ayude a alguien Mi solución usando Runnable

Respuesta corta

 Runnable runnable = new Runnable() { public void run() { if (myAdapter.getCount() == page) { page = 0; } else { page++; } viewPager.setCurrentItem(page, true); handler.postDelayed(this, delay); } }; 

Respuesta larga Uso en una actividad

 public class activity extends AppCompatActivity { private Handler handler; private int delay = 5000; //milliseconds private ViewPager viewPager; private int page = 0; private MyAdapter myAdapter; Runnable runnable = new Runnable() { public void run() { if (myAdapter.getCount() == page) { page = 0; } else { page++; } viewPager.setCurrentItem(page, true); handler.postDelayed(this, delay); } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler(); viewPager = (ViewPager) findViewById(R.id.viewPager); myAdapter = new MyAdapter(getSupportFragmentManager()); viewPager.setAdapter(myAdapter); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { page = position; } @Override public void onPageScrollStateChanged(int state) { } }); } @Override protected void onResume() { super.onResume(); handler.postDelayed(runnable, delay); } @Override protected void onPause() { super.onPause(); handler.removeCallbacks(runnable); } } 

He creado un proyecto de código abierto en github , que implementa un ViewPager de desplazamiento automático, diagtwig de ejemplo a continuación: auto srcoll viewPager

utilizar

  

reemplazar

  

llame a startAutoScroll() para iniciar el desplazamiento automático.

stopAutoScroll() para detener el desplazamiento automático.

Más: https://github.com/Trinea/android-auto-scroll-view-pager

El siguiente método se usa para cambiar de página automáticamente después de un tiempo (puede modificar el tiempo según sus necesidades)

  private void timer() { timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { if (currentPage == NUM_PAGES - 1) { currentPage = 0; } view.setCurrentItem(currentPage++, true); } }); } }, 500, 5000); } 

si desea un desplazamiento sin fin en el visor, use la clase de viewpager de desplazamiento infinito desde el enlace que se proporciona a continuación y realice cambios menores (condición de eliminación) en la interfaz Runnable.

 runOnUiThread(new Runnable() { @Override public void run() { view.setCurrentItem(currentPage++, true); } }); 

Además, no olvide cancelar el temporizador en Destruir vista.

Puede usar setCurrentItem para cambiar la página

Si desea reproducir automáticamente las páginas de viewpager, pero sobretodo, la solución es correcta, pero después de la reproducción automática, el primer elemento consume tiempo de demora, pero está mal después de la reproducción automática. El elemento actual cambia rápidamente. Estoy agregando mi código a continuación, está funcionando correctamente reproducción automática / pausa.

  @Override public void onClick(View v) { if (!isAutoPlay) { img_autoplay.setImageResource(R.drawable.pause); int currentcount = getModel().getCurrentIndex(); currentcount++; getMainImage().setCurrentItem(currentcount); autoPlay(getMainImage()); isAutoPlay = true; } else { img_autoplay.setImageResource(R.drawable.auto_play); isAutoPlay = false; } } }); 

y aquí está el método:

  viewPager.postDelayed(new Runnable() { @Override public void run() { try { if (myAdapter != null && viewPager.getAdapter().getCount() > 0 && isAutoPlay) { getWindow().addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); int currentcount = getModel().getCurrentIndex(); currentcount++; viewPager.setCurrentItem(currentcount); if (getModel().isLastCard()) { final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { isAutoPlay = false; packFinished(); getWindow() .clearFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } }, 6000); } autoPlay(viewPager); } } catch (Exception e) { } } }, 6000); 

Si va a cambiar de página automáticamente, debe desactivar la búsqueda / deslizar en ViewPager porque si toca en la página y esa página de tiempo cambia, entonces no se ve bien significa que observó la página golpeada.

Para desactivar la búsqueda / deslizamiento en ViewPager, debe agregar el siguiente fragmento de código con su paginador de visualización personalizado.

 import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.animation.Interpolator; import java.lang.reflect.Field; public class ViewPagerCustomDuration extends ViewPager { private boolean swipeable = false; public ViewPagerCustomDuration(Context context) { super(context); postInitViewPager(); } public ViewPagerCustomDuration(Context context, AttributeSet attrs) { super(context, attrs); postInitViewPager(); } public void setSwipeable(boolean swipeable) { this.swipeable = swipeable; } @Override public boolean onTouchEvent(MotionEvent event) { if (this.swipeable) { return super.onTouchEvent(event); } return false; } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (this.swipeable) { return super.onInterceptTouchEvent(event); } return false; } private ScrollerCustomDuration mScroller = null; /** * Override the Scroller instance with our own class so we can change the * duration */ private void postInitViewPager() { try { Field scroller = ViewPager.class.getDeclaredField("mScroller"); scroller.setAccessible(true); Field interpolator = ViewPager.class.getDeclaredField("sInterpolator"); interpolator.setAccessible(true); mScroller = new ScrollerCustomDuration(getContext(), (Interpolator) interpolator.get(null)); scroller.set(this, mScroller); } catch (Exception e) { } } /** * Set the factor by which the duration will change */ public void setScrollDurationFactor(double scrollFactor) { mScroller.setScrollDurationFactor(scrollFactor); } } 

después de eso, llame al método desde el objeto de visualización de buscapersonas.

 import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity { ViewPagerCustomDuration viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_3); viewPager = (ViewPagerCustomDuration) findViewById(R.id.viewpager); viewPager.setScrollDurationFactor(2); viewPager.setAdapter(new CustomPagerAdapter(this)); viewPager.setSwipeable(false); pageSwitcher(5); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); } Timer timer; int page = 1; public void pageSwitcher(int seconds) { timer = new Timer(); // At this line a new Thread will be created timer.scheduleAtFixedRate(new RemindTask(), 0, seconds * 1000); // delay // in // milliseconds } // this is an inner class... class RemindTask extends TimerTask { @Override public void run() { // As the TimerTask run on a seprate thread from UI thread we have // to call runOnUiThread to do work on UI thread. runOnUiThread(new Runnable() { public void run() { if (page > 4) { // In my case the number of pages are 5 // timer.cancel(); page = 0; viewPager.setCurrentItem(page++); // Showing a toast for just testing purpose Toast.makeText(getApplicationContext(), "Timer stoped", Toast.LENGTH_LONG).show(); } else { viewPager.setCurrentItem(page++); } } }); } } 

Clase de desplazamiento para la página de desplazamiento sin problemas

 import android.annotation.SuppressLint; import android.content.Context; import android.view.animation.Interpolator; import android.widget.Scroller; public class ScrollerCustomDuration extends Scroller { private double mScrollFactor = 1; public ScrollerCustomDuration(Context context) { super(context); } public ScrollerCustomDuration(Context context, Interpolator interpolator) { super(context, interpolator); } @SuppressLint("NewApi") public ScrollerCustomDuration(Context context, Interpolator interpolator, boolean flywheel) { super(context, interpolator, flywheel); } /** * Set the factor by which the duration will change */ public void setScrollDurationFactor(double scrollFactor) { mScrollFactor = scrollFactor; } @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, (int) (duration * mScrollFactor)); } }