其他动画方案
手工制作动画。在Android和iOS上,手工制作动画是设计和工程设计的巨大时间投入。通常很难甚至不可能证明花这么多时间来制作动画是正确的。
GIF。Gif的大小是bodymovin JSON的两倍以上,并且以固定大小呈现,无法放大以匹配大型和高密度屏幕。
Png序列。Png序列甚至比gif更糟糕,因为它们的文件大小通常是bodymovin json大小的30-50倍,并且也无法放大。
可绘制矢量动画(仅适用于Android)。性能更高,因为它在RenderThread而不是主线程上运行。仅支持Lottie功能的子集。无法手动设置进度。不支持文字或动态颜色。无法以编程方式或通过互联网加载。
导入项目
dependencies {
...
implementation "com.airbnb.android:lottie:$lottieVersion"
...
}
获取一个json动画,lottie_clickable_rainbow.json
放到raw中,如果没有raw文件夹,在res下新建一个
在layout中导入
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/demo_lottie"
android:layout_width="100dp"
android:layout_height="100dp"
...
app:lottie_autoPlay="true"
app:lottie_loop="true"
app:lottie_rawRes="@raw/lottie_check_mark_yes" />
在代码中可以进行控制:
bind.apply {
demoLottieResumeButton.setOnClickListener {
//恢复暂停的动画
demoLottieView.resumeAnimation()
}
demoLottiePauseButton.setOnClickListener {
//暂停动画
demoLottieView.pauseAnimation()
}
//获取当前动画进度0F..1F
demoLottieView.addAnimatorUpdateListener {
demoLottieSlider.value = it.animatedFraction
}
demoLottieSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
override fun onStartTrackingTouch(slider: Slider) {
demoLottieView.pauseAnimation()
}
override fun onStopTrackingTouch(slider: Slider) {
demoLottieView.resumeAnimation()
}
})
demoLottieSlider.addOnChangeListener { slider, value, fromUser ->
if (fromUser){
//设置当前动画进度0F..1F
demoLottieView.progress = slider.value
}
}
}