使用Lottie实现动画

使用Lottie实现动画

您好。我是zm soft,去年(2023年底)注册为开发者,开始发布应用。我们也计划发布面向开发者的应用,有兴趣的话请查看。

大家在应用中使用动画显示吗?只要有一点动画,应用就会变得更容易理解,外观也更好看,不是吗?因此,今天我想写一篇关于在Android应用中显示动画的文章。

LottieAnimation

我使用的是动画显示库LottieAnimation。因为可以相对简单地显示轻量级动画,所以我选择使用它。

可以显示哪些动画/动画种类

首先,这个库的优点之一是可免费使用的动画种类丰富。例如,有以下这类动画。

这些动画发布在LottieFiles的官方网站上。虽然付费动画也很多,但仅筛选免费的动画就已经足够使用了。基本上,因为我既没有从头创建动画的技能,也没有那个精力,所以想要添加一些动态效果时,首先会想到从这个网站寻找可用的素材。例如,使用这类动画,可以在首次显示时告诉用户常用的点击位置。我实际上使用了右侧的动画来为用户提供操作引导。

重点:简便性

在实现方面也可以相当简单地处理。例如,如果只是想在固定的布局中显示动画,只需按以下方式定义就可以运行。不需要实现任何逻辑就能运行,是不是很棒?

Lottie的简单实现方法

Lottie的实现非常简单。只需将动画嵌入到特定布局中,无需额外逻辑即可运行。

实现示例:

   <com.airbnb.lottie.LottieAnimationView
        android:id="@+id/lottie_id"
        app:lottie_rawRes="@raw/your_lottie_animation"/>

Lottie的基本使用方法

使用Lottie的主要步骤如下:

  • 引入库(修改build.gradle)
  • 获取并放置动画文件
  • 设置布局文件
  • 自定义动画

具体实现示例和代码

以下提供使用Lottie时的具体实现示例。包括库的引入、动画文件的放置方法、布局文件的设置方法以及动画的自定义方法。

在build.gradle中添加/引入库:
首先,引入库以便能够使用Lottie。
如果没有兼容性问题,请使用最新版本。

dependencies {
    implementation 'com.airbnb.android:lottie:3.4.0'
}

放置动画文件:
LottieFiles官方网站下载喜欢的动画文件(.json),放置到应用的res/raw文件夹中。

设置布局文件:
在XML布局中添加LottieAnimationView,使其能够引用下载的动画文件。

自定义动画:
根据需要自定义动画的行为。在动画设置中,可以进行以下操作:

  • 是否循环播放
  • 指定循环次数
  • 指定播放速度(包括反向播放)

通过添加动态处理,可以在任意时间播放/停止,也可以改变播放速度。

首先,关于静态指定方式。动画行为根据以下设置而改变。

   <com.airbnb.lottie.LottieAnimationView
        android:id="@+id/lottie_id"
        android:scaleType="centerCrop"
        app:lottie_autoPlay="true"
        app:lottie_loop="true"
        app:lottie_speed="0.15"
        app:lottie_rawRes="@raw/your_lottie_animation"/>

在此示例中,your_lottie_animation.json文件以0.15倍播放速度自动播放并循环。

接下来是动态处理:

lottieAnimationView.playAnimation()

使用以上处理可以播放动画。除了播放外,还可以通过更改设置来停止播放、改变速度等。也可以像以下这样设置监听器,检测播放结束并进行处理:

        lottieAnimationView.addAnimatorListener(object : Animator.AnimatorListener {
            override fun onAnimationStart(animation: Animator) {
                // アニメーション開始時の処理
            }

            override fun onAnimationEnd(animation: Animator) {
                // アニメーション終了時の処理
            }

            override fun onAnimationCancel(animation: Animator) {
                // アニメーションがキャンセルされた時の処理
            }

            override fun onAnimationRepeat(animation: Animator) {
                // アニメーションがリピートされる時の処理
            }
        })

注意事项和故障排除

Lottie非常方便,但有一些注意事项。特别是,对象位置的更改有时可能不会按预期工作。此外,我也将说明与动画结束时的处理相关的堆栈溢出问题,以及onPause后的行为。

故障排除示例1:
这是我实现中的问题:动画结束时的处理方式导致了堆栈溢出。具体来说,在动画到达末尾时进行反向播放、循环播放和反向播放的处理存在问题。通过向主线程发布并重新加入队列解决了这个问题:

        lottieAnimationView.addAnimatorListener(object : Animator.AnimatorListener {
            override fun onAnimationStart(animation: Animator) {
                // アニメーション開始時の処理
            }

            override fun onAnimationEnd(animation: Animator) {
                // アニメーション終了時の処理
                lottieAnimationView.speed = lottieAnimationView.speed*(-1) // 逆再生のためにスピードを逆にする
                lottieAnimationView.post {
                    // 直接呼ぶと再起呼び出しでスタックオーバーフローするのでPOSTする
                    if(isAttachedToWindow) {
                        lottieAnimationView.playAnimation()
                    }
                }
            }

            override fun onAnimationCancel(animation: Animator) {
                // アニメーションがキャンセルされた時の処理
            }

            override fun onAnimationRepeat(animation: Animator) {
                // アニメーションがリピートされる時の処理
            }
        })

故障排除示例2:
另一个需要注意的是onPause后的处理。为了避免不必要的操作,应该在后台停止动画。

    override fun onResume(owner: LifecycleOwner) {
        super.onResume(owner)
        // アニメーションを開始
        lottieAnimationView.playAnimation()
    }

    override fun onPause(owner: LifecycleOwner) {
        lottieAnimationView.cancelAnimation()
        super.onPause(owner)
    }

然而,如果在动画结束时等进行处理,仅靠这个还不够。因此,需要检查父视图是否已经分离并重新处理:

                    if(isAttachedToWindow) {
                        binding.lottieBackground.playAnimation()
                    }

总结

Lottie是提升应用UI的强大工具。可免费使用的动画资源丰富,实现也很简单。理解注意事项并妥善处理,可以在应用开发中获得巨大优势。虽然有一些注意事项,但整体上非常易于使用,且有很多可免费使用的资源,因此我认为这是一个出色的库。它无疑会对改善应用的外观有所帮助,请务必尝试一下。