簡體   English   中英

將Android Lottie動畫對齊以滾動

[英]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完成的,下面的動畫是通過valueAnimatorsetProgress

破碎的抽獎動畫

更新的答案

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:

  • ValueCallbackTIME_REMAP使用以為單位的時間值,而不是進步或幀數!
  • 動畫必須運行-否則valueCallback.setValue(..)將無效(例如,放入循環中)

我非常希望有人會提出比這個更好的解決方案!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM