2017-05-03 16 views
0

Ich mache eine Intro-Aktivität, die in einem TabLayout mit drei Fragmenten besteht.Verlangsamen Tab Animation auswählen

Ich habe zwei Tasten unter meinem TabLayout - eins für "Skip" das Intro und das andere für "Next" Bildschirm/Registerkarte. Sie arbeiten gut, aber ich möchte einige Änderungen auf den „Weiter“ -Funktion machen:

Wenn ich auf die Schaltfläche „Weiter“ er tut dies:

tabLayout.getTabAt(tabLayout.getSelectedTabPosition() + 1).select() 

Und er ist in der Tat die nächste Registerkarte Auswahl , aber ich frage mich, ob ich die Folie/Auslagerungs-Animation der Registerkarte verlangsamen könnte. Kann ich die Animation etwas übersteuern, damit ich sie verlangsamen kann?

EDIT

habe ich eine benutzerdefinierte Klasse, die TabLayout erweitert:

public class CustomTabLayout extends TabLayout { 

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

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

    public CustomTabLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 
} 

Und ich bemerkte, dass die TabLayout Klasse diese Methode hat:

private void animateToTab(int newPosition) { 
    if (newPosition == Tab.INVALID_POSITION) { return; } 

    if (getWindowToken() == null || !ViewCompat.isLaidOut(this) || mTabStrip.childrenNeedLayout()) { 
     setScrollPosition(newPosition, 0f, true); 
     return; 
    } 

    final int startScrollX = getScrollX(); 
    final int targetScrollX = calculateScrollXForTab(newPosition, 0); 

    if (startScrollX != targetScrollX) { 
     ensureScrollAnimator(); 

     mScrollAnimator.setIntValues(startScrollX, targetScrollX); 
     mScrollAnimator.start(); 
    } 

    mTabStrip.animateIndicatorToPosition(newPosition, ANIMATION_DURATION); 
} 

Das Problem ist, dass ANIMATION_DURATION ist eine private statische endgültige Konstante, die in der TabLayout-Klasse auf 300 festgelegt wird. Kann ich diesen Wert etwas auf 1000 ändern, um beispielsweise die Animation zu verlangsamen?

EDIT 2

Wie azizbekian vorgeschlagen, ich versuche, diesen Wert mit Reflexion zu ändern:

public CustomTabLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    setAnimationDuration(); 
} 

static void setAnimationDuration() { 
    try { 
     Field field = TabLayout.class.getDeclaredField("ANIMATION_DURATION"); 
     field.setAccessible(true); 
     field.set(field.get(TabLayout.class), 2000); 

     int v = (int) field.get(TabLayout.class); 
     // v == 2000; so I guess that I changed the value successfully 
    } catch (Exception e) { e.printStackTrace(); } 
} 

Aber wenn meine Registerkarten erstellt werden, es hat immer noch die gleiche Transaktionsdauer (zu schnell). Mache ich mit der Reflexion etwas falsch? Oder ist diese "ANIMATION_DURATION" nicht der richtige Wert, der geändert werden soll?

Antwort