2017-05-03 1 views
0

세 조각으로 된 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"이 (가) 올바른 값이 아닙니다. 당신이 see in sources 수있는

답변

0

는 애니메이션 기간은 정의되지 않습니다 :

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

그래서, 그것은 어느 스타일 (xml)에서,도 자바 코드를 통해 구성 할 수 없습니다.

시도 할 수있는 것은 change the value of private static final field through reflection입니다.

관련 문제