I am doing a Intro Activity that consists in a TabLayout with three fragments.
I have two buttons below my TabLayout - one for "Skip" the intro and the other for "Next" screen/tab. They are working fine but I would like to make some changes on the "Next" function:
When I click the "Next" button he does this:
tabLayout.getTabAt(tabLayout.getSelectedTabPosition() + 1).select()
And he is indeed selecting the next tab, but I was wondering if I could slow down the slide/swap animation of the tab. Can I somewhat Override de animation so I can slow it down?
EDIT
I created a custom class that extends TabLayout:
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);
}
}
And I noticed that the TabLayout class has this method:
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);
}
The problem is that ANIMATION_DURATION is a private static final constant set to 300 in the TabLayout class. Can I somewhat change this value to 1000 for example to slow down the animation?
EDIT 2
As suggested by azizbekian, I am trying to change this value using reflection:
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(); }
}
But when my tabs are created, it still has the same transaction duration (to fast). Am I doing something wrong with reflection? Or this "ANIMATION_DURATION" is not the correct value to change?