我对任何类型的动画都有疑问。我想制作实质性的横幅广告行为,但要使用其他动画。实际上我得到了结果,但是问题是动画后视图在闪烁。我的代码:
第一个示例:
val anim = TranslateAnimation(1f, 1f, 1f, 0f)
anim.duration = 300
banner.startAnimation(anim)
banner.visibility = View.INVISIBLE
第二个示例
val mTransition = Slide(Gravity.END)
mTransition.setDuration(300)
mTransition.addTarget(banner)
TransitionManager.beginDelayedTransition(banner, mTransition)
banner.setVisibility(View.GONE)
有人可以解释如何避免view
闪烁以及它为什么发生。
答案 0 :(得分:1)
问题出在代码banner.visibility = View.INVISIBLE
和banner.setVisibility(View.GONE)
上。尝试将其删除。
如果想要banner
在动画结束后消失了。尝试在动画上添加一个侦听器,并在动画结束后隐藏banner
:
val anim = TranslateAnimation(1f, 1f, 1f, 0f)
anim.duration = 300
anim.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(animation: Animation?) {
}
override fun onAnimationEnd(animation: Animation?) {
// banner.visibility = View.INVISIBLE
// or
// banner.setVisibility(View.GONE)
}
override fun onAnimationStart(animation: Animation?) {
}
})
答案 1 :(得分:0)
我通过其他方式动画化了视图闪烁的问题。我使用了以下策略。首先,我使用了Guideline
的{{1}}组件。我将横幅限制在其顶部,并放置参数ConstraintLayout
。之后,我使用layout_constraintGuide_begin = "0dp"
来获得ValueAnimator
的动画值并更改了Guideline
的参数(请参见代码)。
guidebegin
这是动画的声明。最后,使用 val params: ConstraintLayout.LayoutParams = guideline2.layoutParams as ConstraintLayout.LayoutParams
animBanner = ValueAnimator.ofInt(0, banner.height + toolbar.height)
animBanner!!.addUpdateListener {
params.guideBegin = it.getAnimatedValue() as Int
guideline2.layoutParams = params
}
开始动画,使用animBanner.start()
进行反向动画(隐藏横幅)就足够了。
答案 2 :(得分:0)
我了解在@John Lee的帮助下我遇到了什么问题,但是该解决方案不适合我,因此我将Guideline
组件与AnimatedValue
一起使用。我的解决方案:
params = view.layoutParams as ConstraintLayout.LayoutParams
anim = ValueAnimator.ofInt(fromY, toY)
anim.addUpdateListener {
params.guideBegin = it.animatedValue as Int
view.layoutParams = params
}
因此,这里fromY
的值为0,toY
的值为横幅广告的高度,视图为Guideline
,view.height
可以接收。我应该提到,首先,我的横幅广告限制在Guideline
的{{1}}顶部。然后,我借助上面的代码并使用constraintGuide_begin=0
和anim.start()
方法对本指南进行了动画处理。