簡體   English   中英

慢速選項卡選擇動畫

[英]Slow down tab select animation

我正在做一個包含三個片段的TabLayout的介紹活動。

我的TabLayout下面有兩個按鈕-一個用於“跳過”簡介,另一個用於“下一個”屏幕/選項卡。 它們工作正常,但我想對“下一步”功能進行一些更改:

當我單擊“下一步”按鈕時,他這樣做:

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

他的確在選擇下一個選項卡,但是我想知道是否可以放慢該選項卡的幻燈片/交換動畫。 我可以在某種程度上替代動畫,以便放慢速度嗎?

編輯

我創建了一個擴展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”不是要更改的正確值?

如您在源代碼所見 ,動畫持續時間不可自定義:

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

因此,既不能通過樣式( xml )也不能通過Java代碼進行配置。

您只能嘗試通過反射更改私有靜態最終字段的值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM