#android #image #animation
#Android #изображение #Анимация
Вопрос:
Я пытаюсь анимировать изображение, начиная с экрана ниже, поднимаясь вверх, а затем снова опускаясь (делаю приложение для Galaxy tab). Обе эти анимации работают отдельно, но когда я пытаюсь создать AnimationSet, я не могу заставить их работать. Я даже пытался создать 2 асинхронные задачи и вызвать 2-ю анимацию в onPostExecute 1-й асинхронной задачи, но все равно не сработает.
это мой XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@ id/rel_layout"
>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ad200"
android:id="@ id/image"
/>
</RelativeLayout>
И это мой код, который я пытаюсь использовать для анимации изображения:
AnimationSet set = new AnimationSet(true);
Animation anim1 = new TranslateAnimation(0, 0, 1024, 824);
anim1.setDuration(3000);
anim1.setFillAfter(true);
set.addAnimation(anim1);
Animation anim2 = new TranslateAnimation(0, 0, 824, 1024);
anim2.setDuration(3000);
anim2.setFillAfter(true);
set.addAnimation(anim2);
imageView.clearAnimation();
set.setFillAfter(true);
imageView.startAnimation(set);
Ответ №1:
Ну, ВендиКидд,
Вы очень близки к своему решению. Вы только что пропустили анимацию.AnimationListener() в вашем коде.
Animation anim1 = new TranslateAnimation(0, 0, 1024, 824);
anim1.setDuration(3000);
anim1.setFillAfter(true);
anim1.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
Animation anim2 = new TranslateAnimation(0, 0, 824, 1024);
anim2.setDuration(3000);
anim2.setFillAfter(true);
imageView.clearAnimation();
imageView.startAnimation(anim2);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
imageView.startAnimation(anim1);
Приведенный выше пример запустит anim2 после завершения anim1.
Ответ №2:
Похоже, вы запускаете обе анимации одновременно. Добавьте anim2.setStartOffset(3000) ко второй анимации. Это приведет к запуску второй анимации через 3000 мс после первой.
Братан, Кристоффер
Комментарии:
1. Я уже пробовал это, я все еще получаю только черный экран, ничего не происходит.
Ответ №3:
Вот оно, решение…попробуйте этот приведенный ниже код .. я использую этот код так много раз .. и он отлично работает .. ======>
Animation zoomin =new TranslateAnimation(1, 1, 0, -50);
zoomin.setDuration(1000);
zoomin.setFillEnabled(true);
zoomin.setFillAfter(true);
Animation zoomout = new TranslateAnimation(1, 1, -50, 0);
zoomout.setDuration(1000);
zoomout.setFillEnabled(true);
zoomout.setFillAfter(true);
imageView.startAnimation(zoomin);
zoomin.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation arg0) {
imageView.startAnimation(zoomout);
}
});
zoomout.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation arg0) {
imageView.startAnimation(zoomin);
}
});
Ответ №4:
Все приведенные выше ответы слишком сложны и могут быть написаны более простым способом.
Решение Kotlin выглядит следующим образом:
val animation: Animation = TranslateAnimation(0F, 0F, 0F, -100F)
animation.duration = 3000
animation.fillAfter = true
animation.repeatCount = Animation.INFINITE
animation.repeatMode = Animation.REVERSE
Здесь установлены следующие основные переменные:
animation.repeatCount = Animation.INFINITE
animation.repeatMode = Animation.REVERSE
Я предполагаю, что вы хотите анимировать что-то, чтобы оно постоянно перемещалось вверх и вниз (или влево и вправо), поэтому вы можете использовать animation.repeatCount = Animation.INFINITE
и если вы хотите, чтобы анимация возвращалась в предыдущее положение вместо перехода сверху вниз, а затем сбрасывала его положение, используйте animation.repeatMode = Animation.REVERSE