动画播放后视图会闪烁

时间:2019-11-08 10:35:24

标签: android android-animation android-transitions translate-animation

我对任何类型的动画都有疑问。我想制作实质性的横幅广告行为,但要使用其他动画。实际上我得到了结果,但是问题是动画后视图在闪烁。我的代码:

第一个示例:

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闪烁以及它为什么发生。

3 个答案:

答案 0 :(得分:1)

问题出在代码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?) {
            }

        })

答案 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的值为横幅广告的高度,视图为Guidelineview.height可以接收。我应该提到,首先,我的横幅广告限制在Guideline的{​​{1}}顶部。然后,我借助上面的代码并使用constraintGuide_begin=0anim.start()方法对本指南进行了动画处理。