[英]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.