Android, анимировать изображение вверх и обратно вниз

#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