[英]Align Android Lottie animation to scrolling
我想将我的Lottie动画进度与RecyclerView或ViewPager的滚动对齐。 但是,Lottie似乎仅显示“真实”框架,而不在它们之间进行插值。 在正常播放动画时,不会发生这种情况,Lottie会在帧之间进行插值。 如果滚动真的很慢,我可以看到RecyclerView滚动了,但是Lottie不会更新框架。 这是我目前正在做的事情:
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val offset = recyclerView.computeHorizontalScrollOffset()
val extent = recyclerView.computeHorizontalScrollExtent()
val range = recyclerView.computeHorizontalScrollRange()
val percentage = offset.toFloat() / (range.toFloat() - extent.toFloat())
lottieAnimationView.progress = percentage
}
}
当我尝试更新ValueAnimator中的进度时,会发生相同的问题,例如:
val valueAnimator = ValueAnimator.ofFloat(0f, 1f)
valueAnimator.duration = 30000
valueAnimator.addUpdateListener { animation ->
lottieAnimationView.progress = animation.animatedFraction
}
valueAnimator.start()
我不确定我是否想念某些东西,或者Lottie不支持。 它似乎可以与iOS一起使用。
这是我的问题的示例视频。 最上面的动画是通过playAnimation
完成的,下面的动画是通过valueAnimator
和setProgress
:
更新的答案
自3.0.7
版以来,此问题已修复( Github Issue )。 现在可以使用setProgress(float)
并在帧之间进行插值。
老答案
我最终遇到了一个棘手的解决方法。 可以使用ValueCallback
调整动画的ValueCallback
。 如果动画是合成(因此其图层具有自己的时间轴),则可以调整时间范围本身。 幸运的是我的动画就是这种情况。
使用上面的示例,当“ Root-Layer”被称为“ root”时,这将导致以下代码:
val valueCallback = LottieValueCallback(1f)
lottieAnimationView.addValueCallback(KeyPath("root"), LottieProperty.TIME_REMAP, valueCallback)
val valueAnimator = ValueAnimator.ofFloat(0f, 3.14f)
valueAnimator.duration = 30000
valueAnimator.addUpdateListener { animation ->
valueCallback.setValue(animation.animatedValue as Float)
}
valueAnimator.start()
Sidenodes:
ValueCallback
与TIME_REMAP
使用以秒为单位的时间值,而不是进步或帧数! valueCallback.setValue(..)
将无效(例如,放入循环中) 我非常希望有人会提出比这个更好的解决方案!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.