【问题标题】:Animation only triggers the first time动画只在第一次触发
【发布时间】:2016-04-08 20:07:51
【问题描述】:

我正在 Android 上制作一个应用程序,它会在单击按钮时生成两个可用图像中的一个,并且在 1 秒的持续时间后,该图像应该会消失,让用户可以选择再次单击该按钮。

问题是动画在第一次按下按钮时运行顺畅(即生成图像然后消失),但是在第二次按下按钮时,图像就在那里,没有任何反应。我不知道为什么。

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

        final ImageView firstimage = (ImageView)findViewById(R.id.imageView2);
        final ImageView secondimage = (ImageView)findViewById(R.id.imageView1);
        final Button clickMe = (Button)findViewById(R.id.button);
        final TextView image_description = (TextView)findViewById(R.id.textView);
        image_description.setText("");

        final Animation fadeout = new AlphaAnimation(1,0);
        fadeout.setStartOffset(1000);
        fadeout.setDuration(1000);
        secondimage.setAnimation(fadeout);
        firstimage.setAnimation(fadeout);
        image_description.setAnimation(fadeout);
        secondimage.setVisibility(View.GONE);
        firstimage.setVisibility(View.GONE);
        image_description.setVisibility(View.GONE);
        clickMe.setVisibility(View.VISIBLE);    

        fadeout.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) { }

            @Override
            public void onAnimationEnd(Animation animation) {
                System.out.println("Animation block");
                secondimage.setVisibility(View.GONE);
                firstimage.setVisibility(View.GONE);
                image_description.setVisibility(View.GONE);
                clickMe.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) { }
        }); 

        clickMe.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                System.out.println("Click block");
                Random r = new Random();
                int i = r.nextInt(2);
                clickMe.setVisibility(View.GONE);
                if(i == 0) {
                    secondimage.setVisibility(View.VISIBLE);
                    image_description.setText("LOOK it's a CAT");
                    image_description.setVisibility(View.VISIBLE);
                    secondimage.setAnimation(fadeout);
                    image_description.setAnimation(fadeout);
                } else {
                    firstimage.setVisibility(View.VISIBLE);
                    image_description.setText("LOOK it's a DOG");
                    image_description.setVisibility(View.VISIBLE);
                    firstimage.setAnimation(fadeout);
                    image_description.setAnimation(fadeout);
                }    
            }
        });    
    }

日志看起来像这样:

Click Block
Animation Block
Click Block
Click Block
Click Block
Click Block

知道为什么代码在第二次点击后没有到达动画块吗?

【问题讨论】:

  • 不是 100% 确定,但我认为您需要在完成动画制作或再次制作动画之前通过在视图上调用 .clearAnimation() 来清除动画状态。
  • 试过不行。

标签: android android-animation image-generation


【解决方案1】:

好的。我能够解决我自己的查询。

我换了

secondimage.setAnimation(fadeout);

secondimage.startAnimation(fadeout);

这样做后,代码就能够到达 onAnimationEnd 函数。

【讨论】:

    【解决方案2】:

    最简单的做法是为每个需要动画的视图创建/膨胀动画类型对象的新实例。正如你现在所拥有的,它正在尝试重用同一个对象。

    【讨论】:

    • 所以基本上每次按下按钮 clickMe 时都会在 rand if-else 块内创建一个新的动画对象?
    • 是的,或者提前创建它们并在必要时使用它们,确保它们每个只使用一次。
    • 我不确定这是因为动画还是 onClick 事件。是因为 onClickListener 只被调用一次?
    • 我尝试了一些日志记录,问题是第二次点击我的代码没有到达 AnimationListener 块
    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2021-11-28
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2021-08-14
    相关资源
    最近更新 更多