Animate Alpha ImageView 淡入淡出

Animate Alpha ImageView Fade In Fade Out

提问人:Imran 提问时间:11/17/2023 最后编辑:Imran 更新时间:11/17/2023 访问量:38

问:

在视图模型的 observe 方法中,新的 Observer 正在侦听正常工作的 API 响应。但是,根据响应,它调用以下代码来显示成功或失败图像。

此代码位于其自己的方法中,每次应显示图像时都会调用该方法:

  1. 我只能让图像显示一次,后续方法调用不会显示任何图像,即使在调试期间我们到达了每一行。

  2. imageView 框在 XML 中正确对齐,最初设置为 gone。(也尝试过隐形)。

         imageView.setVisibility(View.VISIBLE);
    
         //Fade in
         imageView.animate().alpha(1).setDuration(1000);
    
         if(!successful) {
             imageView.setImageDrawable(getResources().getDrawable(R.drawable.failed_img));
         } else {
             imageView.setImageDrawable(getResources().getDrawable(R.drawable.success_img));
         }
    
         //Fade out
         imageView.animate().alpha(0).setDuration(1500).setStartDelay(1000);
    
Android ImageView jquery-动画 alpha

评论

0赞 SnailBird 11/17/2023
您设置 .然后,ImageView 突然出现。imageView.setVisibility(View.VISIBLE);
0赞 SnailBird 11/17/2023
问题 2,因为 imageView 的 alpha 为 0。你看不到视图。你可以测试设置 alpha=1,然后你会看到图片。
0赞 Imran 11/17/2023
@SnailBird 但是这一行不是将 alpha 设置回可见吗: imageView.animate().alpha(1).setDuration(1000);

答:

0赞 SnailBird 11/17/2023 #1

我发现你的第二个动画效果是第一个动画。您可以在下面看到,第二个动画应该等待第一个动画完成。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    lifecycleScope.launch {
        for (i in 0 until 10) {
            changeView()

            withContext(Dispatchers.IO) {
                delay(10_000)
            }
        }
    }
}

private fun changeView() {
    binding.apply {
        // avoid abruptly appears
        imageView.alpha = 0f

        imageView.isVisible = true
        imageView.animate()
            .alpha(1f)
            .setDuration(3000)
            .start()

        /**
         * IMPORTANT:
         *  You should wait the first animation finished,
         *  then start the second animation.
         *  Because imageView.animate() method return the SAME Object.
         *
         *  You can add a delay to wait the first animation finished.
         *  If you don't add a delay, the second config will effect the first animation.
         */
        lifecycleScope.launch {
            delay(3000)
            imageView.animate()
                .alpha(0f)
                .setDuration(2000)
                .start()
        }
    }
}

评论

0赞 Imran 11/17/2023
我试过设置为不可见并消失了。但它不会第二次再次出现。
0赞 SnailBird 11/17/2023
你最后设置了 alpha = 0 ,那么你就看不到它了。
0赞 Imran 11/17/2023
整个代码位于一个方法中,该方法在成功或失败响应时调用。所以每次都先调用这一行:imageView.animate().alpha(1).setDuration(1000);
0赞 SnailBird 11/17/2023
@Imran 你配置好了动画,但没有启动它。您需要在最后一个调用方法。imageView.animate().alpha(1).setDuration(1000).;imageView.animate().alpha(0).setDuration(1500).setStartDelay(1000)。start()start()start();
0赞 Imran 11/17/2023
谢谢。我也尝试了有和没有开始,但它仍然没有第二次出现。
0赞 Imran 11/17/2023 #2

只是不会再次出现,可能是因为在后台,它在第二次调用时调用了 onAnimationRepeat。因此,最好的解决方案是在这种情况下直接使用 Animation 类。如果有人能回答为什么原始代码不起作用,我会非常有兴趣了解原因。

    Animation a = new AlphaAnimation(1.00f, 0.00f);

    a.setDuration(3000);
    a.setAnimationListener(new Animation.AnimationListener() {

        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }

        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        public void onAnimationEnd(Animation animation) {
            imageView.setVisibility(View.GONE);

        }
    });

    imageView.startAnimation(a);