2015-06-10 12 views
0

Предположим, у меня есть пользовательский объект, такой как класс Point (я не использую тот, который установлен на Android), и мне нужно медленно менять его координаты от начального значения до конечного значения, когда пользователь дважды отбирает экран. У меня уже есть все настройки, но я не могу «оживить» это изменение. Вы знаете, как я могу это сделать?Анимация пользовательской переменной объекта

Я уже пытался что-то подобное, но не получил никаких изменений: ObjectAnimator (точка, "point.variable", final_value) .start()

ответ

1

Вы можете настроил ObjectAnimator неправильно.

Предположим, что у вашего класса Point есть переменная экземпляра xPosition, которая является Integer. Для того, чтобы оживить xPosition с ObjectAnimator, вы могли бы сделать это:

ObjectAnimator.ofInt(new Point(), // Instance of your class 
        "xPosition", // Name of the property you want to animate 
        startValue, // The initial value of the property 
        ... intermediateValues ..., // Any other desired values 
        endValue) // The final value of the property 
    .setDuration(duration) // Make sure to set a duration for the Animator 
    .start(); // Make sure to start the animation. 

ObjectAnimator будет пытаться автоматически обновить свойство после каждого кадра, но для того, чтобы быть успешным, ваш класс должен иметь надлежащий setter для свойства в формате setYourProperty. Поэтому в этом конкретном примере ваш класс должен иметь метод под названием setXPosition (обратите внимание на случай верблюда).

Если по какой-то причине это не работает, вы возвращаетесь на ValueAnimator. Аналогичным образом вы настроили ValueAnimator.

ValueAnimator anim = ValueAnimator.ofInt(startValue // Initial value of the property 
             endValue) // Final value of the property 
    .setDuration(duration); // Make sure to set a duration for the Animation. 

Разница заключается в том, что вы должны вручную обновить свою собственность. Для этого добавим AnimatorUpdateListener к анимации, метод onAnimationUpdate будет вызываться после каждого кадра в анимации.

anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
     // Manually call the xPosition's setter method. 
     point.setXPosition(animation.getAnimatedValue()); 
    } 
}); 

И не забудьте начать анимацию.

anim.start(); 

Для получения более подробной информации о ValueAnimator и ObjectAnimator см Руководство по API от Google по анимации собственности: http://developer.android.com/guide/topics/graphics/prop-animation.html#value-animator

+0

Хорошо, я получил это работает. Благодаря! Еще один вопрос: если я имею дело с собственными переменными, я обязан использовать ValueAnimator? Или я могу использовать какое-то свойство, чтобы избежать внедрения UpdateListener? –

+0

Если вы используете ValueAnimator, вам очень нужно использовать UpdateListener, иначе у вас не будет способа реально связать значения, которые аниматор производит для вашей переменной. В большинстве случаев ObjectAnimator должен работать нормально, пока вы в порядке с предоставлением правильного метода настройки. Я не совсем уверен, что вы подразумеваете под собственными переменными, но переменная, объявленная локально, не может использоваться в ValueAnimator, поскольку вы можете ссылаться только на локальную переменную изнутри UpdateListener, если она объявлена ​​окончательной, что тогда помешало бы вам фактически изменяя значение. –

+0

По собственной переменной я имею в виду те, которые не определены пользователем, другими словами int, double, float и т. Д. Так как они не являются объектами, я не знаю, что установить в качестве параметра в ObjectAnimator. Так я должен использовать ValueAnimator для них? –

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