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?