首页
/ Lottie-Android动画库中获取动画时长的正确方式

Lottie-Android动画库中获取动画时长的正确方式

2025-05-03 13:16:59作者:宣聪麟

问题背景

在使用Lottie-Android动画库时,开发者可能会遇到一个常见问题:在设置动画后立即调用getDuration()方法获取动画时长时,返回值为0。这种情况通常发生在以下代码场景中:

binding.lottieAnimation.setAnimation(fileName)
val animationDuration = binding.lottieAnimation.duration // 这里返回0

技术原理分析

Lottie动画加载机制

Lottie动画的加载和解析是一个异步过程。当我们调用setAnimation()方法时,实际上触发了以下流程:

  1. 从指定路径读取动画JSON文件
  2. 解析JSON内容并构建LottieComposition对象
  3. 将解析完成的Composition应用到Drawable中

这个过程需要时间,特别是在动画较复杂或设备性能较低的情况下。

为什么直接获取duration返回0

查看LottieAnimationView的源码可以发现:

public long getDuration() {
    LottieComposition composition = getComposition();
    return composition != null ? (long) composition.getDuration() : 0;
}

getComposition()方法的实现是:

@Nullable 
public LottieComposition getComposition() {
    return getDrawable() == lottieDrawable ? lottieDrawable.getComposition() : null;
}

在动画尚未完成加载和解析时:

  1. getDrawable()可能返回null
  2. 或者Drawable尚未与LottieComposition关联
  3. 导致最终返回的duration为0

解决方案

推荐方案:使用Composition加载监听器

最可靠的方式是注册一个Composition加载监听器:

binding.lottieAnimation.addLottieOnCompositionLoadedListener { composition ->
    val duration = composition.duration // 这里可以获取正确的时长
    // 处理获取到的duration
}
binding.lottieAnimation.setAnimation(fileName)

其他可行方案

  1. 延迟获取:在确保动画已加载完成后获取duration
  2. 预加载动画:提前加载动画并缓存LottieComposition对象

最佳实践建议

  1. 避免在设置动画后立即获取duration
  2. 对于需要依赖动画时长的逻辑,应在监听器中处理
  3. 考虑将duration缓存起来供后续使用
  4. 在UI线程中处理duration相关逻辑,避免线程安全问题

总结

理解Lottie动画的异步加载机制对于正确使用其API至关重要。通过使用Composition加载监听器,开发者可以确保在正确的时机获取动画时长,避免因异步加载导致的问题。这种模式在Android开发中很常见,掌握它有助于更好地处理各种异步资源加载场景。

登录后查看全文
热门项目推荐
相关项目推荐