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