2015-05-30 228 views
2

我搜索了越來越多,但我還沒有找到任何答案。所以請告訴我如何使用AnimatorInflater.loadStateListAnimator(..)view.setStateListAnimator(..)方法在前棒棒糖,有沒有什麼辦法來做,而不是那些?Android StateListAnimator在前棒棒糖

回答

3

StateListAnimator是一個狀態發生變化時啓動的Animator。可以在舊版Android上實現。我正在回收Carbon中的那些內容,但目前該庫僅支持高程動畫。

要實現國家動畫延伸a View,並覆蓋drawableStateChanged

397  @Override 
398  protected void drawableStateChanged() { 
399   super.drawableStateChanged(); 
402   if (stateAnimators != null) 
403    for (StateAnimator animator : stateAnimators) 
404     animator.stateChanged(getDrawableState()); 
405  } 

然後實現an animator與國家動畫您希望:

23  @Override 
24  protected void onPressedChanged() { 
25   if (pressed) { 
26    setTranslationZ(pressedElevation); 
27   } else { 
28    setTranslationZ(0); 
29   } 
30  } 
31 

32  private void setTranslationZ(float translationZ) { 
33   if (view.getTranslationZ() == translationZ || view.getElevation() == 0) 
34    return; 
35   ValueAnimator animator = ValueAnimator.ofFloat(view.getTranslationZ(), translationZ); 
36   animator.setInterpolator(new AccelerateDecelerateInterpolator()); 
37   animator.setDuration(300); 
38   animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
39    @Override 
40    public void onAnimationUpdate(ValueAnimator animation) { 
41     view.setTranslationZ((Float) animation.getAnimatedValue()); 
42    } 
43   }); 
44   animator.start(); 
45  } 

和簡單state change detector class(超類每個動畫師):

10  public void stateChanged(int[] states) { 
11   boolean newPressed = false, newEnabled = false, newChecked = false; 
12   for (int state : states) { 
13    if (state == android.R.attr.state_enabled) { 
14     newEnabled = true; 
15    } else if (state == android.R.attr.state_pressed) { 
16     newPressed = true; 
17    } else if (state == android.R.attr.state_checked) { 
18     newChecked = true; 
19    } 
20   } 
21   if (pressed != newPressed) { 
22    pressed = newPressed; 
23    onPressedChanged(); 
24   } 
25   if (enabled != newEnabled) { 
26    enabled = newEnabled; 
27    onEnabledChanged(); 
28   } 
29   if (checked != newChecked) { 
30    checked = newChecked; 
31    onCheckedChanged(); 
32   } 
33  } 

讓所有視圖具有正確的狀態動畫是相當複雜和耗時的,但是您可以通過在drawableStateChanged中添加動畫來實現該動畫。

+1

非常感謝你,這是我所尋找的。你可以節省很多時間)) –