кастомный повтор анимации перевода в android

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

В каждом цикле анимации мне нужно изменить изображение на случайное из списка, поэтому я обнаружил, что если я использую повторяющуюся анимацию, то установка нового ImageResource на onAnimationRepeat of AnimationListener не обновляет мой ImageView. Я решил использовать пользовательский запуск следующей анимации из onAnimationEnd. Вот кусок кода:

    ImageView image = (ImageView)(ImageView)findViewById(R.id.imageId);

    Animation aMid = AnimationUtils.loadAnimation(this, R.anim.plant_middle);  
    aMid.setFillEnabled(true);
    aMid.setFillAfter(true);
    aMid.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) { 
            setRandomImageResource();
        }

        @Override
        public void onAnimationRepeat(Animation animation) { }

        @Override
        public void onAnimationEnd(Animation animation) {
            if(customCounter < SPIN_COUNT){
                customCounter++;
                image.startAnimation(aMid);
            }
        }
   });

И Animation ixm довольно прост, речь идет о том, что ImageView идет от левой части экрана к правой:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="true">

    <translate
         android:interpolator="@android:anim/linear_interpolator"
         android:fromXDelta="-100%"
         android:toXDelta="100%"
         android:fromYDelta="0%"
         android:toYDelta="0%"
         android:duration="4000" /> 
</set>

Проблема заключается в том, что между каждым циклом анимации ImageView появляется в центре экрана на очень короткий момент, как будто он летит справа налево, чтобы начать следующий цикл анимации, или как бы мерцает в середина, где он изначально расположен в макете xml.

Установка видимости GONE на onAnimationEnd и VISIBLE на onAnimationEnd не решает проблему.

Что делать?


person dykzei eleeot    schedule 26.10.2010    source источник


Ответы (3)


Я использовал ваш код для своего приложения и расскажу, как я решаю эту проблему. Прежде всего, когда вы создаете тег ImageView в файле XML, вы не должны устанавливать для него источник следующим образом:

<ImageView android:id="@+id/cloud_image"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_alignParentTop="true" 
    android:layout_marginTop="20dip"
    android:adjustViewBounds="false" 
    android:scaleType="fitXY" />

После этого вы должны установить источник ImageView в функцию onAnimationStart() и установить источник пустого изображения (пустое и 100% прозрачное изображение) в функцию onAnimationEnd():

// == Animation listener ====================================================
mCloudsAnimation.setAnimationListener(new AnimationListener() {

        public void onAnimationStart(Animation animation) {
            mCloudsImage.setBackgroundResource(R.drawable.clouds);
        }

        public void onAnimationRepeat(Animation animation) {
        }

        public void onAnimationEnd(Animation animation) {
            mCloudsImage.setBackgroundResource(R.drawable.clear_sky);
            mCloudsImage.startAnimation(mCloudsAnimation);
        }
});

На эмуляторе работает. Сейчас попробую на своем устройстве.

person cotalfa    schedule 11.10.2011

Мне удалось добиться необходимого, установив поле макета слева на -1000 и обратно на onAnimationEnd/onAnimationStart вместо того, чтобы делать видимость. Однако решение уродливое.

person dykzei eleeot    schedule 26.10.2010

Добавьте «setFillAfter (true)» в AnimationSet тоже (не только в анимацию). У меня это сработало.

person Paola G    schedule 12.02.2013