2012-07-28 7 views
8

Peut-on faire un pageur de vue pour glisser automatiquement ou autopage. J'ai mon viewpager configuré pour utiliser l'adaptateur comme ci-dessous et il fonctionne très bien: -Comment faire pour glisser automatiquement Android Voir pager

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

setContentView(R.layout.gridslide); 
ImagePagerAdapter mAdapter = new ImagePagerAdapter(
     getSupportFragmentManager(),4); 
ViewPager mPager = (ViewPager) findViewById(R.id.pager); 
mPager.setAdapter(mAdapter); 
} 

Et l'adaptateur est comme ci-dessous: -

public static class ImagePagerAdapter extends FragmentStatePagerAdapter { 
private final int mSize; 

public ImagePagerAdapter(FragmentManager fm, int size) { 
    super(fm); 
    mSize = size; 
} 

@Override 
public int getCount() { 
    return mSize; 
} 
@Override 
public Fragment getItem(int position) { 
    Log.v(TAG,"position="+position); 
    return TheFragment.newInstance(position); 
}} 

Cependant, je voudrais savoir comment faire ces fragments se déplacent automatiquement dans un viewpager.

+0

Voulez-vous également une animation de diapositives? – sandrstar

+1

@sandrstar bien je ne dirai pas non si je peux obtenir cela aussi :-) – Rasmus

+0

https://github.com/ajaydewari/AutoSlideViewpager – HAXM

Répondre

12

La définition de smoothScroll = true dans setCurrentItem (int item, boolean smoothScroll) n'a pas toujours l'effet de défilement lisse. Supposons que si vous avez moins de 5 pages dans votre viewpager, vous remarquerez à peine le défilement lisse.

Dans ce scénario, la façon difficile de le faire est de le mettre dans une boucle

//This will scroll page-by-page so that you can view scroll happening 
for (int i = 0; i < mAdapter.getCount()-1; i++) 
    mPager.setCurrentItem(i, true); 

Si quelqu'un a besoin de plus défilement plus lent, ils peuvent utiliser postDelayed() comme ça ...

static int i=0; 
private final Handler handler = new Handler(); 
somefunction() 
{ 
    handle.post(ViewPagerVisibleScroll); 
} 

    Runnable ViewPagerVisibleScroll= new Runnable() { 
       @Override 
       public void run() { 
        if(i <= mAdapter.getCount()-1) 
        { 
         mPager.setCurrentItem(i, true); 
         handle.postDelayed(TopChartAnimation, 100); 
         i++; 
        } 
       } 
      }; 

Le sommeil est toujours pas recommandé: Si quelqu'un a besoin de spirales plus lent, ils peuvent utiliser un sommeil dans cette boucle ...

@Override 
public void onClick(View v) { 
Runnable runnable = new Runnable() { 
       @Override 
       public void run() { 
        for (int i = 0; i < mAdapter.getCount()-1; i++) { 
         final int value = i; 
         try { 
          Thread.sleep(50); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
         handler.post(new Runnable() { 
          @Override 
          public void run() { 
           mPager.setCurrentItem(value, true); 
          } 
         }); 
        } 
       } 
      }; 
      new Thread(runnable).start(); 

     } 
+4

Certainement, dormir dans le fil de l'interface utilisateur est une mauvaise idée. Il est préférable d'utiliser postDelayed() à la place. – sandrstar

+1

@sandrstar Oui, j'accepte votre suggestion. J'ai réédité le code en supprimant Thread.sleep() – Raghu

+0

Les deux créent une fuite de mémoire. – Ungoogleable

11

Probablement, Vous devriez jeter un oeil aux API suivantes ViewPager.beginFakeDrag(), ViewPager. fakeDragBy(float offset) et ViewPager.endFakeDrag() si vous voulez la simulation de glisser. En outre, les API setCurrentItem() permettent de définir la page actuelle et de le faire en douceur. La façon la plus simple que je pourrais suggérer de faire automatiquement une diapositive est de configurer Handler avec Runnable simple qui appelle les méthodes pager pour définir l'élément dans l'activité et faire juste postDelayed() pour cela. Et n'oubliez pas d'appeler removeCallbacks() pour cela lorsque l'interaction de l'utilisateur ou par ex. pause d'activité.

+0

Que voulez-vous dire par supprimer les rappels ?? comment puis-je supprimer un runnable? – Shruti

+0

Je voulais dire removeCallbacks, comme ici http://developer.android.com/reference/android/os/Handler.html#removeCallbacks%28java.lang.Runnable%29 qui fournit la possibilité d'annuler l'exécution Runnable prévue pour Handler. – sandrstar

Questions connexes