其他動(dòng)畫方案
手工制作動(dòng)畫闰挡。在Android和iOS上,手工制作動(dòng)畫是設(shè)計(jì)和工程設(shè)計(jì)的巨大時(shí)間投入礁哄。通常很難甚至不可能證明花這么多時(shí)間來制作動(dòng)畫是正確的长酗。
GIF。Gif的大小是bodymovin JSON的兩倍以上桐绒,并且以固定大小呈現(xiàn)夺脾,無法放大以匹配大型和高密度屏幕。
Png序列茉继。Png序列甚至比gif更糟糕咧叭,因?yàn)樗鼈兊奈募笮⊥ǔJ莃odymovin json大小的30-50倍,并且也無法放大烁竭。
可繪制矢量動(dòng)畫(僅適用于Android)菲茬。性能更高,因?yàn)樗赗enderThread而不是主線程上運(yùn)行。僅支持Lottie功能的子集婉弹。無法手動(dòng)設(shè)置進(jìn)度睬魂。不支持文字或動(dòng)態(tài)顏色。無法以編程方式或通過互聯(lián)網(wǎng)加載镀赌。
導(dǎo)入項(xiàng)目
dependencies {
...
implementation "com.airbnb.android:lottie:$lottieVersion"
...
}
獲取一個(gè)json動(dòng)畫氯哮,lottie_clickable_rainbow.json
放到raw中,如果沒有raw文件夾商佛,在res下新建一個(gè)
在layout中導(dǎo)入
<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" />
在代碼中可以進(jìn)行控制:
bind.apply {
demoLottieResumeButton.setOnClickListener {
//恢復(fù)暫停的動(dòng)畫
demoLottieView.resumeAnimation()
}
demoLottiePauseButton.setOnClickListener {
//暫停動(dòng)畫
demoLottieView.pauseAnimation()
}
//獲取當(dāng)前動(dòng)畫進(jìn)度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){
//設(shè)置當(dāng)前動(dòng)畫進(jìn)度0F..1F
demoLottieView.progress = slider.value
}
}
}