Выровняйте анимацию Android Lottie для прокрутки - PullRequest
0 голосов
/ 08 марта 2019

Я хочу выровнять прогресс анимации Lottie с помощью прокрутки RecyclerView или ViewPager.Однако Лотти, кажется, показывает только «настоящие» кадры и не интерполирует их.При нормальном воспроизведении анимации этого не происходит, и Лотти интерполирует кадры.Если я прокручиваю очень медленно, я вижу, что мой 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()

Я не уверен, что пропустилчто-то или это не поддерживается Лотти.Похоже, что работает с iOS.

Вот пример видео моей проблемы.Верхняя анимация выполняется через playAnimation, нижняя - через valueAnimator и setProgress:

Broken Lottie Animation

1 Ответ

0 голосов
/ 12 марта 2019

Обновленный ответ

Проблема исправлена ​​( Github Issue ) начиная с версии 3.0.7.Теперь можно использовать setProgress(float), и он интерполирует между кадрами.

Старый ответ

Я получил хакерский обходной путь.Можно настроить части анимации с помощью 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(..) не будет иметь никакого эффекта (например, поместите его в цикл)

Я серьезно надеюсь, что кто-то найдет лучшее решение, чем это!

...