我正在做一个包含三个片段的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”不是要改变的正确值?
答案 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。