Код анимации начинается до завершения первой анимации - PullRequest
0 голосов
/ 22 января 2020

Я попытался настроить простую анимацию подбрасывания монет для действия подбрасывания монет. Поэтому я создал два рисованных объекта (coin_heads и coin_tails) и настроил этот фрагмент кода. Я создаю случайное значение, и после этого у меня есть простое выражение if, чтобы определить, должны ли появляться головы или хвосты. В зависимости от того, что ничья будет заменено. Я уже знал, что всякий раз, когда вы заменяете рисованный элемент на yourobject.setImageDrawable(ContextCompat.getDrawable(this,drawable)); его вращение, масштабируйте и т. c сбрасываются (поэтому я хочу установить вращение и альфа на значения, которые я анимировал до этого).

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

cimg.setAlpha(1f);
        cimg.animate().alphaBy(-1f).setDuration(800);

Итак, чтобы описать, что происходит: как только я нажимаю кнопку, чтобы перевернуть монету, альфа изображения сразу устанавливается на 0 и затем анимированные назад к 1 во времени 800 мс. Но я хочу, чтобы он сначала анимировался в Alpha = 0 через 800 мс, а затем снова в 1 в 800 мс.

Вот код метода flip (я много комментировал во время отладки):

public void flip(View view) {
        TextView coin = (TextView) findViewById(R.id.coinField);
        ImageView cimg = (ImageView) findViewById(R.id.coinimage);


        double flip1 = Math.random();

        //start of animation
        //cimg.animate().scaleXBy(4f).setDuration(1000);
        //cimg.animate().scaleYBy(4f).setDuration(1000);
        //cimg.animate().rotationBy(180f).setDuration(1000);

//first animation
        cimg.setAlpha(1f);
        cimg.animate().alphaBy(-1f).setDuration(800);

//final animation

        if (flip1>=0.5) {
            coin.setText(R.string.heads);
            cimg.setImageDrawable(ContextCompat.getDrawable(this,R.drawable.coin_heads));
            //cimg.setRotation(180f);
            cimg.setAlpha(0f);
            cimg.animate().alpha(1f).setDuration(800);


            //cimg.animate().rotationBy(180f).setDuration(1000);
            //cimg.animate().scaleXBy(0.25f).setDuration(1000);
            //cimg.animate().scaleYBy(0.25f).setDuration(1000);
        }
        else {
            coin.setText(R.string.tails);
            cimg.setImageDrawable(ContextCompat.getDrawable(this,R.drawable.coin_tails));
            //cimg.setRotation(180f);
            cimg.setAlpha(0f);
            cimg.animate().alpha(1f).setDuration(800);
            //cimg.animate().rotationBy(180f).setDuration(1000);
            //cimg.animate().scaleXBy(0.25f).setDuration(1000);
            //cimg.animate().scaleYBy(0.25f).setDuration(1000);
        }


    }

Я был бы очень рад, если бы у кого-нибудь было решение для этого, поскольку я боролся с этим часами. Я также попытался использовать Thread.sleep(1000), чтобы убедиться, что анимация завершена, но при этом она по-прежнему пропускает первую анимацию, ждет 1 секунду, а затем выполняет свою работу как обычно.

Редактировать:

Я настроил это так. Теперь, когда я нажимаю кнопку, ничего не происходит:

    public void flip(View view) {
        final TextView coin = (TextView) findViewById(R.id.coinField);
        final ImageView cimg = (ImageView) findViewById(R.id.coinimage);

        final double flip1 = Math.random();

        Animation anim = new Animation() {
            @Override
            protected Animation clone() throws CloneNotSupportedException {
                cimg.setAlpha(1f);
                cimg.animate().alpha(0f).setDuration(800);
                return super.clone();
            }
        };


        final Animation anim2 = new Animation() {
            @Override
            protected Animation clone() throws CloneNotSupportedException {
                if (flip1>=0.5) {
                    coin.setText(R.string.heads);
                    cimg.setImageDrawable(getDrawable(R.drawable.coin_heads));
                    cimg.setAlpha(0f);
                    cimg.animate().alpha(1f).setDuration(800);

                }
                else {
                    coin.setText(R.string.tails);
                    cimg.setImageDrawable(getDrawable(R.drawable.coin_tails));
                    //cimg.setRotation(180f);
                    cimg.setAlpha(0f);
                    cimg.animate().alpha(1f).setDuration(800);
                }
                return super.clone();
            }
        };

        anim2.setAnimationListener(null);


        Animation.AnimationListener list = new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                anim2.start();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }



        };

        anim.setAnimationListener(list);
    }

1 Ответ

1 голос
/ 23 января 2020

Используйте слушателя анимации, чтобы запустить вторую анимацию после окончания первой:

    final Animation anim = new SomeTypeOfAnimation();
    anim.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
             //Start your other animation here...
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...