2017-05-03 70 views
0

我正在做一个介绍活动,其中包含三个片段的TabLayout。减速选项卡选择动画

我在我的TabLayout下有两个按钮 - 一个用于“跳过”介绍,另一个用于“下一个”屏幕/标签。他们工作正常,但我想提出“下一步”功能的一些变化:

当我点击“下一步”按钮,他这样做:

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

而且他确实是在选择下一个选项卡,但我想知道是否可以减慢制表符的幻灯片/交换动画。我可以稍微覆盖de动画,这样我可以减慢它的速度吗?

编辑

我创建的延伸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); 
    } 
} 

而且我注意到,该TabLayout类有这个方法:

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); 
} 

的问题是,ANIMATION_DURATION是在TabLayout类中设置为300的私有静态最终常量。我可以稍微将此值更改为1000,例如,以减慢动画速度?

EDIT 2

至于建议的azizbekian,我想使用反射来改变这个值:

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(); } 
} 

但创建我的标签时,它仍然具有相同的交易时间(加快)。我在反思中做错了什么?或者这个“ANIMATION_DURATION”不是要改变的正确值?

回答