为 Android 工具栏下方的视图 appearing/disappearing 设置动画

Animate a view appearing/disappearing below Android Toolbar

我当前的 Android 应用程序需要一个视图以从工具栏下方滑动 down/up。

我希望动画“黄油般”流畅并包含淡入淡出和滑动方面。

由于多种原因,我的代码并不令人满意。

它只工作一次,然后我的视图仍然“出现”但是它是不可见的!

它远非“黄油般”光滑

这是我的代码

 private fun animateContainer(height: Int, visibility: Int) {
        myContainer.animate()
            .translationY(height.toFloat())
            .setDuration(300)
            .setListener(object : AnimatorListenerAdapter() {
                override fun onAnimationEnd(animation: Animator?) {
                    super.onAnimationEnd(animation)
                    animation?.removeAllListeners()
                    myContainer.clearAnimation()
                    myContainer.visibility = visibility
                }
            })
    }

最初我的视图是隐藏的,当用户单击一个按钮时,视图应该向下滑动并淡入,将始终显示的可见视图向下推。

使容器出现的调用是

animateSearchContainer(myContainer.height, View.VISIBLE)

让容器消失的调用是

animateSearchContainer(-pdfSearchContainer.height, View.GONE)

我不明白为什么在使视图出现和消失的第一个循环之后,视图在静态时不可见,但是当它离开屏幕时会立即出现。

我也不明白为什么动画这么“生涩”

是否可以达到我想要的效果,使我的视图始终顺畅地上下滑动?

我哪里做错了?

我确实也有 .alpha(targetAlpha) 作为动画的一部分,但我认为这是导致我的问题的原因,因此将其删除。

首先可能是View.GONE的使用使得View不仅不可见,而且在布局中也不再占用space。您最好使用 View.INVISIBLE.

第二件事是这些电话:

animation?.removeAllListeners()
myContainer.clearAnimation()

动画一结束就会重置,难怪它只能工作一次,你应该把它们去掉,如果你想要连续的上下动画,它们就没有意义了。

第三件事是您正在更改 onAnimationEnd() 中的 Visibility,正如其名称所述,它会在动画结束后立即执行。所以你在给一个Invisible View做动画,然后改成Visible,难怪看不到动画了。

第四件事是你为什么要改变可见性?如果它正确地滑到 Toolbar 后面,它也不可见,所以您实际上可以删除 Visibility 部分,甚至可能完全删除整个 onAnimationEnd() 方法。

为了平滑,您使用 Interpolator。 最常见的是 AccelerateDecelerateInterpolator :

myContainer.animate()
        .translationY(height.toFloat())
        .setDuration(300)
        .setInterpolator(new AccelerateDecelerateInterpolator())

所以这一切都是这样:

 private fun animateContainer(height: Int) {
        myContainer.animate()
            .translationY(height.toFloat())
            .setDuration(300)
            .setInterpolator(new AccelerateDecelerateInterpolator())
 }

只要你有正确的高度值作为参数,这应该可以工作:

animateContainer(myContainer.height)  // appear
animateContainer(-pdfSearchContainer.height)  // disappear

如果您想 'push down' 一个视图,您也必须对其进行动画处理,或者将它们都放在一个容器中 f.e。一个 ConstraintLayout 并为整个容器设置动画