动画后视图闪烁

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.INVISIBLEbanner.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?) {
            }

        })

我通过以其他方式设置动画解决了视图闪烁的问题。我使用了以下策略。首先,我使用了 ConstraintLayoutGuideline 组件。我将我的横幅限制在它的顶部并放置参数 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() 方法对这个指南进行了动画处理。