减慢选项卡选择动画

时间:2017-05-03 14:24:29

标签: java android android-tablayout

我正在做一个包含三个片段的TabLayout的Intro活动。

我的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,例如减慢动画吗?

编辑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”不是要改变的正确值?

1 个答案:

答案 0 :(得分:0)

尽可能see in sources,动画持续时间无法自定义:

private static final int ANIMATION_DURATION = 300;
...
mScrollAnimator.setDuration(ANIMATION_DURATION);

因此,它既不能从样式(xml)配置,也不能通过Java代码配置。

您唯一能做的就是change the value of private static final field through reflection