Android-AlphaAnimation-淡出图像视图比淡入其他图像视图



我的页面上有一个徽标,对于某个事件,我想显示一个错误图像,而不是徽标,它会进入淡出,然后徽标会重新出现在淡入中

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)

在我的情况下,使用此代码,问题是应该转到fadeOut的错误徽标永远不会显示(而转到FadeIn的原始徽标稍后工作(

如果删除了第二个动画,则第一个动画将正确显示。看起来,一个接一个地,只取第二个(或者第二个"覆盖"第一个(

使用glide。你可以用它来动画化变化,并用图像做很多工作

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)

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

最新更新