我正在做一个介绍活动,其中包含三个片段的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”不是要改变的正确值?