Как динамически настроить продолжительность / скорость анимации анимации в Android - PullRequest
1 голос
/ 01 сентября 2010

Допустим, у меня есть приложение для Android, и в этом приложении я хочу анимировать изображение шара в форме буквы "L". Это потребует от меня определения анимации анимации, в которой я создаю анимационный XML-файл (написанный ниже) и применяю его к представлению, в котором есть изображение шара.

<translate>
Ydelta = 20;
offset = 0;
duration = 100;
</translate>

<translate>
Xdelta = 20;
offset = 100;
duration = 100;
</translate>

Теперь допустим, что я хочу динамически управлять скоростью этой анимации, чтобы со временем анимация L работала все быстрее и быстрее. Как я могу динамически контролировать скорость всей этой анимации? Я пробовал myAnimation.setDuration ($ var), но, похоже, это работает только в первой части анимации. Любая часть анимации со смещением больше 0 не имеет своей длительности, регулируемой методом setDuration ().

Кто-нибудь знает, как я могу равномерно масштабировать мультисетную анимацию?

Спасибо

ps - я знаю, что есть способы решения этой проблемы, такие как создание анимации из двух частей и масштабирование каждой части независимо или создание анимации с использованием кода, но если есть более простое решение, то это было бы предпочтительным.

1 Ответ

8 голосов
/ 21 сентября 2010

Я решил это самостоятельно. Чтобы масштабировать всю анимацию, вам нужно программно создавать анимации, и когда вы устанавливаете продолжительность анимации с помощью setDuration();, вы передаете ей переменную вместо жесткого кодирования в XML.

Теперь каждый раз, когда я вызываю свою анимацию, я передаю ей продолжительность анимации mAnimDuration и затем на лету создаю новую масштабированную по времени анимацию. Вы заметите, что смещение второй части анимации установлено равным длительности первой части анимации.

Вот пример из моего кода:

AnimationSet rootSet = new AnimationSet(true);

TranslateAnimation transX = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 2, 0,0,0,0);
transX.setStartOffset(0);  
transX.setDuration(mAnimDuration/2);  
rootSet.addAnimation(transX);

TranslateAnimation transX2 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 2, 0,0,0,0);  
transX2.setStartOffset(mAnimDuration/2);  
transX2.setDuration(mAnimDuration/2);  
rootSet.addAnimation(transX2);
...