2014-05-15 25 views
13

Her 5 saniyede bir otomatik olarak döndürmek istediğim bir ViewPager'ım var, aynı zamanda kullanıcının da kaydırmasına izin veriyor. Ancak, otomatik değişikliği ayarladığım zaman, sayfalar arasındaki geçiş animasyonu gerçekten hızlı gerçekleşir ve bunun daha yavaş olmasını isterim.ViewPager ve setCurrentItem geçiş hızının değiştirilmesi

Burada bu soru için cevaplar

Slowing speed of Viewpager controller in android

ama hepsi kullanımı yansıması gördüm. Bir ViewPager'ın otomatik hızını yansımadan düşürmenin herhangi bir yolunu bilen var mı?

Bir PageTransformer kullanmayı düşündüm, ancak bunun işe yarayıp yaramayacağından emin değilim, ayrıca kullanıcı otomatik olarak olduğu kadar hızlı bir şekilde kaydırırsa hızı etkileyebilirdi? Farkı bir şekilde algılayamaz ve bir veya başka bir PageTransformation yapabilir miyim? Sayfaları otomatik olarak döndürmek için program zamanlayıcı seçeneğini kullan

cevap

19

Kullanımı senin değişimi arasındaki gecikmeyi değiştirme gibi görünüyor Kodunuzdaki bakarak bu Özel View

public class ViewPagerCustomDuration extends ViewPager { 
private FixedSpeedScroller mScroller = null; 

public ViewPagerCustomDuration(Context context) { 
    super(context); 
    init(); 
} 

public ViewPagerCustomDuration(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

/* 
* Override the Scroller instance with our own class so we can change the 
* duration 
*/ 
private void init() { 
    try { 
     Class<?> viewpager = ViewPager.class; 
     Field scroller = viewpager.getDeclaredField("mScroller"); 
     scroller.setAccessible(true); 
     mScroller = new FixedSpeedScroller(getContext(), 
       new DecelerateInterpolator()); 
     scroller.set(this, mScroller); 
    } catch (Exception ignored) { 
    } 
} 

/* 
* Set the factor by which the duration will change 
*/ 
public void setScrollDuration(int duration) { 
    mScroller.setScrollDuration(duration); 
} 

private class FixedSpeedScroller extends Scroller { 

    private int mDuration = 500; 

    public FixedSpeedScroller(Context context) { 
     super(context); 
    } 

    public FixedSpeedScroller(Context context, Interpolator interpolator) { 
     super(context, interpolator); 
    } 

    public FixedSpeedScroller(Context context, Interpolator interpolator, boolean flywheel) { 
     super(context, interpolator, flywheel); 
    } 

    @Override 
    public void startScroll(int startX, int startY, int dx, int dy, int duration) { 
     // Ignore received duration, use fixed one instead 
     super.startScroll(startX, startY, dx, dy, mDuration); 
    } 

    @Override 
    public void startScroll(int startX, int startY, int dx, int dy) { 
     // Ignore received duration, use fixed one instead 
     super.startScroll(startX, startY, dx, dy, mDuration); 
    } 

    public void setScrollDuration(int duration) { 
     mDuration = duration; 
    } 
} 
} 
+0

Teşekkürler, bugün beni kurtardın – Ezio

+1

Aslında bunu neden sorduğumu ya da nasıl çözdüğümü hatırlamıyorum, ama bu cevap kene kadar doğru bir cevap olarak kabul etmeyi kabul ediyorum. Ayrıca, @Ezio çalışır gibi görünüyor: D –

2

.

int i = 0; 
static Timer timer = new Timer(); 

//Scroller scroll = new Scroller(this); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.simple_circles); 

    mAdapter = new TestFragmentAdapter(getSupportFragmentManager()); 

    mPager = (ViewPager) findViewById(R.id.pager); 

    mPager.setAdapter(mAdapter); 

    mIndicator = (CirclePageIndicator) findViewById(R.id.indicator); 

    mIndicator.setViewPager(mPager); 

    mPager.setCurrentItem(i); 

    SwitchPage(3); 


    } 

public void SwitchPage(int seconds) 

{

if(timer != null) 
{ 
    timer.cancel(); 
} 

timer = new Timer(); // At this line a new Thread will be created 

timer.schedule(new SwitchPageTask(), 
2000, seconds * 2000);    
// delay in milliseconds 
} 


class SwitchPageTask extends TimerTask 
{ 

@Override 
public void run() { 

    runOnUiThread(new Runnable() { 

     public void run() { 

      if(i < mAdapter.getCount()) 

      { 

       i++; 

       mPager.setCurrentItem(i, true); 

      } 
      else 
      { 

       i=0; 

       mPager.setCurrentItem(i, true); 
      } 
     } 
    }); 
} 
} 

just cancel the timer like.. timer.cancel().. or 
cancel timer from another activity or fragment activity.. 

    textView1_page3.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       if (SampleCirclesDefault.timer != null) { 
        SampleCirclesDefault.timer.cancel(); 
        Toast.makeText(getActivity(), "timer 
        cancled", 1).show(); 
       } 

      } 
     }); 
+0

Harikrishnan. Bu benim bir sorunum değil. Otomatik geçişin gerçek animasyonunun çok hızlı olduğunu düşünüyorum, neredeyse anında, bir görüntüden bir sonraki yavaşlamaya, değişken bir zaman farkında değil de, onu kaydırmasını istiyorum. Orijinal sorumu daha net hale getirmek için güncelleyeceğim. –