2014-05-15 7 views
13

Ich habe eine ViewPager dass ich jede 5 Sekunden automatisch gedreht werden soll, während es dem Benutzer auch ermöglicht auch Swipe. Wenn ich jedoch die automatische Änderung einstelle, passiert die Übergangsanimation zwischen den Seiten sehr schnell und ich möchte, dass diese langsamer ist.die Geschwindigkeit des Übergangs von ViewPager und setCurrentItem Ändern

Ich habe die Antworten auf diese Frage

Slowing speed of Viewpager controller in android

aber sie alle nutzen Reflexion hier gesehen. Kennt jemand eine Möglichkeit, die automatische Geschwindigkeit eines ViewPagers ohne Reflektion zu verlangsamen?

Ich dachte, einen PageTransformer zu verwenden, aber nicht sicher, ob das funktionieren würde, und auch, es wäre wahrscheinlich die Geschwindigkeit beeinflussen, wenn der Benutzer sowie die automatischen eine geklaut? Es sei denn, ich kann den Unterschied irgendwie feststellen und mache dann die eine oder andere PageTransformation.

Antwort

19

verwenden Benutzerdefinierte 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

Dank Mann, rettete Du mich heute – Ezio

+1

mich nicht wirklich daran erinnern, warum ich das gefragt oder wie ich es gelöst, aber diese Antwort hat Zecken genug auf, dass ich bereit bin, es als eine richtige Antwort zu akzeptieren. Außerdem scheint @Ezio zu glauben, dass es funktioniert: D –

2

Verwendung Zeitschaltuhr Option für Auto drehen, um die Seiten.

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 durch den Code suchen es sieht aus wie Ihr die Verzögerung zwischen der Änderung ändern. Das ist nicht das, womit ich ein Problem habe. Ich denke, dass die eigentliche Animation des Auto-Übergangs zu schnell ist, es ist fast sofort, ich möchte, dass es von einem Bild zum nächsten langsamer läuft, nicht zu einem variablen Zeitunterschied. Ich werde meine ursprüngliche Frage aktualisieren, um das klarer zu machen. –