为 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 并为整个容器设置动画
我当前的 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 并为整个容器设置动画