Android - AlphaAnimation - FadeOut ImageView 比 FadeIn 其他 ImageView

Android - AlphaAnimation - FadeOut ImageView than FadeIn other ImageView

我的页面上有一个徽标,在某个事件中我想显示一个错误图像而不是徽标,它转到 FadeOut,然后徽标在 FadeIn 中重新出现

  val errorDrawable = getDrawable(R.drawable.error)
        imageView.setImageDrawable(errorDrawable)

        val errorFadeOut = AlphaAnimation(1f, 0f)
        errorFadeOut.interpolator = AccelerateInterpolator()
        errorFadeOut.duration = 2000

        errorFadeOut.setAnimationListener(object: Animation.AnimationListener{
            override fun onAnimationRepeat(animation: Animation?) {

            }

            override fun onAnimationEnd(animation: Animation?) {
                imageView.visibility = View.INVISIBLE
            }

            override fun onAnimationStart(animation: Animation?) {

            }
        })
        imageView.startAnimation(errorFadeOut)

        val logoFadeIn = AlphaAnimation(0f, 1f)
        logoFadeIn.interpolator = DecelerateInterpolator()
        logoFadeIn.startOffset = 2000
        logoFadeIn.duration = 1000

        val logoDrawable = getDrawable(R.drawable.logo)
        imageView.setImageDrawable(logoDrawable)

        logoFadeIn.setAnimationListener(object: Animation.AnimationListener{
            override fun onAnimationRepeat(animation: Animation?) {
            }

            override fun onAnimationEnd(animation: Animation?) {
            }

            override fun onAnimationStart(animation: Animation?) {
                imageView.visibility = View.VISIBLE
            }

        })
        imageView.startAnimation(logoFadeIn)

在我的例子中,使用这段代码,问题是永远不会显示应该进入淡出的错误徽标(而进入淡入的原始徽标稍后可以工作)

如果我删除了第二个动画,第一个动画会正确显示。看起来一起,一个接一个,只有第二个被拿走(或者第二个“覆盖”第一个)

使用滑行。 你可以用它来改变动画并用图像做很多工作

implementation 'com.github.bumptech.glide:glide:4.11.0'


    DrawableCrossFadeFactory factory =
            new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build();


Glide.with(java.util.Objects.requireNonNull(getActivity()))
.load(R.drawable.logo)
.transition(DrawableTransitionOptions.withCrossFade(factory))
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.into(imageView)

使用此代码

 val factory: DrawableCrossFadeFactory =
            DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build()

if(error){
        Glide.with(this).load(R.drawable.error)
            .transition(DrawableTransitionOptions.withCrossFade(factory))
            .skipMemoryCache(true)
            .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
            .into(imageView)

}else{
      Glide.with(this).load(R.drawable.logo)
         .transition(DrawableTransitionOptions.withCrossFade(factory))
         .skipMemoryCache(true)
         .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
         .into(imageView)

}

目前,唯一接近所需结果的解决方案是:

 imageView.setImageResource(R.drawable.error)

        Handler().postDelayed({
            val factory: DrawableCrossFadeFactory =
                DrawableCrossFadeFactory.Builder(800).setCrossFadeEnabled(true).build()

            Glide.with(this).load(R.drawable.logo)
                .transition(DrawableTransitionOptions.withCrossFade(factory))
                .skipMemoryCache(true)
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                .into(imageView)
        }, 400)

我马上设置错误图片,然后我必须制作一个处理程序(否则错误图像不会显示),并在处理程序中使用 Glide 重新加载徽标图像

或者,更好:

  val factory: DrawableCrossFadeFactory =
            DrawableCrossFadeFactory.Builder(800).setCrossFadeEnabled(true).build()

        Glide.with(this).load(R.drawable.error)
            .transition(DrawableTransitionOptions.withCrossFade(factory))
            .skipMemoryCache(true)
            .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
            .into(imageView)

        Handler().postDelayed({

            Glide.with(this).load(R.drawable.logo)
                .transition(DrawableTransitionOptions.withCrossFade(factory))
                .skipMemoryCache(true)
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                .into(imageView)
        }, 800)

同样在这种情况下,第二个动画必须在处理程序内完成,否则第一个动画不会显示