项目背景是在界面中弹出一个浮层动画,同时播放一个音效。
实现思路比较简单:继承一个DialogFragment,在相关的生命周期方法onViewCreated中调用startLottieAnim进行动画播放,同时监听lottie动画播放的回调事件,在动画开始播放时播放音效文件;动画播放结束时关闭DialogFragment。
private voidstartLottieAnim(String assetFolder, finalUri voiceUri) {
lottieAnimationView.setImageAssetsFolder(assetFolder + "/images");lottieAnimationView.setAnimation(assetFolder + "/anim.json");lottieAnimationView.setRepeatCount(0);lottieAnimationView.addAnimatorListener(newAnimator.AnimatorListener() {
@Overridepublic voidonAnimationStart(Animator animation) {
playAnimVoice(voiceUri);}
@Overridepublic voidonAnimationEnd(Animator animation) {
stopAnimVoice();dismiss();}
@Overridepublic voidonAnimationCancel(Animator animation) {
stopAnimVoice();dismiss();}
@Overridepublic voidonAnimationRepeat(Animator animation) {
playAnimVoice(voiceUri);}
});lottieAnimationView.playAnimation();}
对于以上的代码,实际运行起来会发现动画播放的同时并不能播放音频,而且播放结束也不会自动消失。也就是说onAnimationStart和onAnimationEnd方法并没有被回调。这是为什么呢?看lottie实现源码 (BaseLottieAnimator),会发现