Android - последовательная зацикленная анимация для N кадров при изменении ImageViews

Я хочу создать простой обратный отсчет «3-2-1», используя три анимированных изображения ImageView, которые вращаются и масштабируются на экране, запускаемые кнопкой. У меня нет проблем с анимацией для одного ImageView, но я не могу получить последовательное выполнение 3... затем 2... затем 1 кадра. Может ли кто-нибудь помочь? Вот упрощенный макет XML для MainActivity

<Button
android:id="@+id/go_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/rotate"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="120dp"
android:text="GO!" />

<ImageSwitcher
android:id="@+id/imageSwitcher"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="220dp" />

Вот одна из моих XML-настроенных анимаций (она уменьшает масштаб ImageView):

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:startOffset="0"
android:fromXScale="5.0"
android:toXScale="1.0"
android:fromYScale="5.0"
android:toYScale="1.0"
android:duration="600"
android:pivotX="50%"
android:pivotY="50%" >
</scale>

а вот файл Java MainActivity:

public class MainActivity extends ActionBarActivity {

private Button animateCountdown;
private ImageSwitcher myImageSwitcher;
private static final int[] IMAGES = { R.drawable.icon_3, R.drawable.icon_2, R.drawable.icon_1};
private int currentIMAGESIndex = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    myImageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher);
    myImageSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
        @Override
        public View makeView() {
            ImageView imageView = new ImageView(MainActivity.this);
            return imageView;
        }
    });

    animateCountdown = (Button) findViewById(R.id.go_button);
    animateCountdown.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            runCountdownAnimation(view);
        }
    });
}

private void runCountdownAnimation(View view){

    //Using an animation set, to allow for concurrent animations.
    AnimationSet animationSet = getCountdownAnimationSet();

   Animation fadeOutAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_out);

    myImageSwitcher.setInAnimation(animationSet);
    myImageSwitcher.setOutAnimation(fadeOutAnimation);

    while(currentIMAGESIndex < (IMAGES.length - 1)){
         myImageSwitcher.setImageResource(IMAGES[currentIMAGESIndex]);
         currentIMAGESIndex++;
         myImageSwitcher.postDelayed(this, 1000);
     }

Я использую набор анимаций, чтобы одновременно запускать масштабирование, альфа-канал и вращение анимации. До сих пор я пытался изменить источник ImageView и перезапустить анимацию из onAnimationEnd() прослушивателя анимации... но безуспешно. Простой цикл по изображениям в массиве тоже не работает.

Как я могу зациклить анимацию 3 раза, но менять ImageView в конце каждой итерации? В конце последней итерации я хочу создать Intent и загрузить новую активность.

Заранее спасибо :)


Обновление... вот код getCountDownAnimationSet():

private AnimationSet getCountdownAnimationSet(){
    Animation rotateAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate);
    Animation fadeAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_in);
    Animation zoomAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.zoom);

    AnimationSet animationSet = new AnimationSet(false); //false means don't share interpolators
    animationSet.addAnimation(rotateAnimation);
    animationSet.addAnimation(fadeAnimation);
    animationSet.addAnimation(zoomAnimation);

    return animationSet;
}

person kingBenny    schedule 13.01.2016    source источник
comment
Хорошо, это довольно сложный подход для чего-то, что кажется довольно простым. Во-первых: мало вещей. Зачем тебе ImageSwitcher? Покажите нам код для getCountdownAnimationSet().   -  person Bartek Lipinski    schedule 13.01.2016


Ответы (1)


Хорошо... так что я разобрался с этим. Я использовал таймер обратного отсчета Android

private void initialiseCountdownTimer(long timerDuration, long timerInterval){
    countDownTimer = new CountDownTimer(timerDuration, timerInterval) {
        @Override
        public void onTick(long millisUntilFinished) {
            if(!countdownImageStack.empty()){
                countdownImage.setImageResource(countdownImageStack.pop());
                countdownImage.startAnimation(countdownAnimationSet);

            }

        }

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

Результат? Никаких неприятных проблем с параллелизмом, но я все же использовал набор Animation для одновременного вращения и масштабирования.

person kingBenny    schedule 15.01.2016