Пользовательское повторение анимации перевода в Android - PullRequest
0 голосов
/ 26 октября 2010

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

В каждом цикле анимации мне нужно менять изображение на случайное ссписок, поэтому я обнаружил, что если я использую повторяющуюся анимацию, то установка нового ImageResource в onAnimationRepeat объекта 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 не решает нашу проблему.

Что делать?

Ответы [ 3 ]

2 голосов
/ 11 октября 2011

Я использовал ваш код для своего приложения, и я расскажу вам, как решить эту проблему.Прежде всего, когда вы создаете тег 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);
        }
});

Работает на эмуляторе.Теперь я собираюсь попробовать это на моем устройстве.

0 голосов
/ 13 февраля 2013

Добавьте "setFillAfter (true)" в AnimationSet (не только для анимации). Это сработало для меня.

0 голосов
/ 27 октября 2010

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

...