我正在做一個介紹活動,其中包含三個片段的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」不是要改變的正確值?