2015-05-30 3 views
2

Я искал все больше и больше, но я не нашел ответа. Так скажите, пожалуйста, как использовать AnimatorInflater.loadStateListAnimator (..) и view.setStateListAnimator (..) методы в pre Lollipop, есть ли способ сделать вместо них?android StateListAnimator in pre Lollipop

ответ

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

Большое вам спасибо, это то, что я искал. Вы экономите много времени)) –

Смежные вопросы