动画后视图闪烁
View blinks after animation
我对任何类型的动画都有疑问。我想制作 material 横幅行为,但要使用其他动画。实际上我得到了结果,但问题是视图在动画之后闪烁。我的代码:
第一个例子:
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
闪烁及其发生的原因。
问题出在代码 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?) {
}
})
我通过以其他方式设置动画解决了视图闪烁的问题。我使用了以下策略。首先,我使用了 ConstraintLayout
的 Guideline
组件。我将我的横幅限制在它的顶部并放置参数 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()
启动动画和 animBanner.reverse()
反向动画(隐藏横幅)就足够了。
在@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
的顶部,它位于 constraintGuide_begin=0
。然后我在上面的代码的帮助下并使用 anim.start()
、anim.reverse()
方法对这个指南进行了动画处理。
我对任何类型的动画都有疑问。我想制作 material 横幅行为,但要使用其他动画。实际上我得到了结果,但问题是视图在动画之后闪烁。我的代码:
第一个例子:
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
闪烁及其发生的原因。
问题出在代码 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?) {
}
})
我通过以其他方式设置动画解决了视图闪烁的问题。我使用了以下策略。首先,我使用了 ConstraintLayout
的 Guideline
组件。我将我的横幅限制在它的顶部并放置参数 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()
启动动画和 animBanner.reverse()
反向动画(隐藏横幅)就足够了。
在@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
的顶部,它位于 constraintGuide_begin=0
。然后我在上面的代码的帮助下并使用 anim.start()
、anim.reverse()
方法对这个指南进行了动画处理。