Анимация с animationSet () в Android - PullRequest
12 голосов
/ 15 июня 2011

ОК, вот в чем проблема у меня есть ImageView в моей деятельности, вот что это выглядит в main.xml:

<ImageView  
android:id="@+id/ic"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:src="@drawable/icon"
android:layout_gravity="center_horizontal"/>

Я хочу, чтобы это изображение переместилось на -200 (влево), затем на 100 (вправо), а затем обратно на 0 с эффектом отскока.

Я реализовал это с помощью своего кода:

as = new AnimationSet(true);
as.setFillEnabled(true);
as.setInterpolator(new BounceInterpolator());

TranslateAnimation ta = new TranslateAnimation(-300, 100, 0, 0); 
ta.setDuration(2000);
as.addAnimation(ta);

AnimationSet sa = new AnimationSet(true);
sa.setFillEnabled(true);
sa.setInterpolator(new DecelerateInterpolator());

TranslateAnimation ta2 = new TranslateAnimation(100, 0, 0, 0); 
ta2.setDuration(2000);
sa.addAnimation(ta2);

as.addAnimation(sa);

вы можете увидеть в коде X переход, который я хочу (-300,100), затем (100, 0)

однако, изображение не двигается так, как должно, вместо этого оно просто останавливается на 100, а затем подпрыгивает ...

хммм ...., вы, ребята, знаете, что не так или что я должен сделать, чтобы добиться этого?

Ответы [ 3 ]

29 голосов
/ 24 июня 2011

Если я не ошибаюсь, вы снимаете за последовательность анимаций.

Интересно, что как только вы запускаете AnimationSet, все добавленные анимации запускаются одновременно, а не последовательно;поэтому вам нужно установить setStartOffset (long offSet) для каждой анимации, следующей за первой анимацией.

Может быть, что-то подобное будет работать ...

as = new AnimationSet(true);
as.setFillEnabled(true);
as.setInterpolator(new BounceInterpolator());

TranslateAnimation ta = new TranslateAnimation(-300, 100, 0, 0); 
ta.setDuration(2000);
as.addAnimation(ta);

TranslateAnimation ta2 = new TranslateAnimation(100, 0, 0, 0); 
ta2.setDuration(2000);
ta2.setStartOffset(2000); // allowing 2000 milliseconds for ta to finish
as.addAnimation(ta2);
15 голосов
/ 04 июня 2014

Я предлагаю вам использовать ObjectAnimator. Это очень легко реализовать ваш случай. Ваша анимация может выглядеть так:

ObjectAnimator animator1 = ObjectAnimator.ofFloat(targetView, "translationX", -200f);
animator1.setRepeatCount(0);
animator1.setDuration(1000);

ObjectAnimator animator2 = ObjectAnimator.ofFloat(targetView, "translationX", 100f);
animator2.setRepeatCount(0);
animator2.setDuration(1000);

ObjectAnimator animator3 = ObjectAnimator.ofFloat(targetView, "translationX", 0f);
animator3.setRepeatCount(0);
animator3.setDuration(1000);

//sequencial animation
AnimatorSet set = new AnimatorSet();
set.play(animator1).before(animator2);
set.play(animator2).before(animator3);
set.start();

Если вы не знакомы с ObjectAnimator, вы можете проверить этот учебник для Android:

Пример просмотра в Android

2 голосов
/ 13 ноября 2011

Что-то вроде этого очень легко в 3.0 и выше.Вот две ссылки, которые я использовал для создания чего-то похожего.

http://android -developers.blogspot.com / 2011/02 / animation-in-honeycomb.html

http://developer.android.com/reference/android/animation/AnimatorSet.Builder.html

...