动画代码在第一个动画完成之前开始

时间:2020-01-22 20:15:51

标签: java android animation

我尝试为硬币翻转活动设置一个简单的硬币翻转动画。 因此,我创建了两个可绘制对象(coin_heads和coin_tails)并设置了这段代码。 我正在创建一个随机值,然后使用一个简单的if语句来决定是否应显示正面还是反面。取决于可绘制对象将被替换。我已经知道,每当用yourobject.setImageDrawable(ContextCompat.getDrawable(this,drawable));替换可绘制对象时,它的旋转度,比例等都会被重置(这就是为什么我想将旋转度和alpha设置为我之前为其设置动画的值的原因。)

我认为使用animate()方法而不是XML参数会更容易,这就是为什么我现在遇到问题。每当我尝试运行此命令时,它都会跳过

的第一行
cimg.setAlpha(1f);
        cimg.animate().alphaBy(-1f).setDuration(800);

因此,为了描述发生的情况:当我按下按钮翻转硬币时,图像的alpha会立即设置为0,然后在800ms的时间内向后动画为1。但是我希望它先在800毫秒内将动画设置为Alpha = 0,然后再在800毫秒内将其设置为动画1。

这是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 个答案:

答案 0 :(得分:1)

在第一个动画结束后,使用动画侦听器开始第二个动画:

    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...
        }
    });