当前位置: 首页 > news >正文

可以做动图的视频网站校园网站建设的目的

可以做动图的视频网站,校园网站建设的目的,网站百度建设,广西建设安全员证查询网站一、背景介绍项目背景是在界面中弹出一个浮层动画#xff0c;同时播放一个音效。二、当前实现实现思路比较简单#xff1a;继承一个DialogFragment#xff0c;在相关的生命周期方法onViewCreated中调用startLottieAnim进行动画播放#xff0c;同时监听lottie动画播放的回调…一、背景介绍项目背景是在界面中弹出一个浮层动画同时播放一个音效。二、当前实现实现思路比较简单继承一个DialogFragment在相关的生命周期方法onViewCreated中调用startLottieAnim进行动画播放同时监听lottie动画播放的回调事件在动画开始播放时播放音效文件动画播放结束时关闭DialogFragment。1234567891011121314151617181920212223242526272829private void startLottieAnim(String assetFolder, final Uri voiceUri){lottieAnimationView.setImageAssetsFolder(assetFolder /images);lottieAnimationView.setAnimation(assetFolder /anim.json);lottieAnimationView.setRepeatCount(0);lottieAnimationView.addAnimatorListener(new Animator.AnimatorListener() {Overridepublic void onAnimationStart(Animator animation){playAnimVoice(voiceUri);}Overridepublic void onAnimationEnd(Animator animation){stopAnimVoice();dismiss();}Overridepublic void onAnimationCancel(Animator animation){stopAnimVoice();dismiss();}Overridepublic void onAnimationRepeat(Animator animation){playAnimVoice(voiceUri);}});lottieAnimationView.playAnimation();}三、发现问题对于以上的代码实际运行起来会发现动画播放的同时并不能播放音频而且播放结束也不会自动消失。也就是说onAnimationStart和onAnimationEnd方法并没有被回调。这是为什么呢看lottie实现源码 (BaseLottieAnimator)会发现123456789void notifyStart(boolean isReverse){for (Animator.AnimatorListener listener : listeners) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) {listener.onAnimationStart(this, isReverse);} else {listener.onAnimationStart(this);}}}12345678void notifyEnd(boolean isReverse){for (Animator.AnimatorListener listener : listeners) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) {listener.onAnimationEnd(this, isReverse);} else {listener.onAnimationEnd(this);}}在通知动画开始和结束的时候会根据系统版本决定走哪个方法这里需要注意方法签名。由于之前代码只写了一个参数的方法回调因此在Android O及以上版本中会走另一个方法回调。因此首先想到需要在注册的AnimatorListener中添加之前遗漏的两个方法回调。12345678910111213141516171819202122232425262728293031323334353637383940{lottieAnimationView.setImageAssetsFolder(assetFolder /images);lottieAnimationView.setAnimation(assetFolder /anim.json);lottieAnimationView.setRepeatCount(0);lottieAnimationView.addAnimatorListener(new Animator.AnimatorListener() {Overridepublic void onAnimationStart(Animator animation){playAnimVoice(voiceUri);}Overridepublic void onAnimationStart(Animator animation, boolean isReverse){playAnimVoice(voiceUri);}Overridepublic void onAnimationEnd(Animator animation){stopAnimVoice();dismiss();}Overridepublic void onAnimationEnd(Animator animation, boolean isReverse){stopAnimVoice();dismiss();}Overridepublic void onAnimationCancel(Animator animation){stopAnimVoice();dismiss();}Overridepublic void onAnimationRepeat(Animator animation){playAnimVoice(voiceUri);}});lottieAnimationView.playAnimation();}修改之后运行会发现动画播放结束的回调事件成功接收了但是音效依然无法播放。也就是onAnimationStart方法依然未被回调。继续看下源码在LottieAnimationView.java中12345678public void playAnimation(){if (isShown()) {lottieDrawable.playAnimation();enableOrDisableHardwareLayer();} else {wasAnimatingWhenNotShown true;}}如果isShown判断成功会继续走LottieDrawable.java中的123456789101112131415161718public void playAnimation(){if (compositionLayer null) {lazyCompositionTasks.add(new LazyCompositionTask() {Overridepublic void run(LottieComposition composition){playAnimation();}});return;}if (systemAnimationsEnabled || getRepeatCount() 0) {animator.playAnimation();}if (!systemAnimationsEnabled) {setFrame((int) (getSpeed() 0 ? getMinFrame() : getMaxFrame()));}}进而走到LottieValueAnimator.java中的playAnimation123456789MainThreadpublic void playAnimation(){running true;notifyStart(isReversed());setFrame((int) (isReversed() ? getMaxFrame() : getMinFrame()));lastFrameTimeNs 0;repeatCount 0;postFrameCallback();}在这里看到了熟悉的notifyStart方法。可是我们并没有收到对应的回调可以想到LottieAnimationView.java中并没有走isShown判断分支也就是说走了12345678public void playAnimation(){if (isShown()) {lottieDrawable.playAnimation();enableOrDisableHardwareLayer();} else {wasAnimatingWhenNotShown true;}}只是标记了一个状态标明lottie动画还未显示出来。那它为什么后来又能播放动画呢在LottieAnimationView.java中有监听可见性回调的方法12345678910111213141516171819protected void onVisibilityChanged(NonNull View changedView, int visibility){// This can happen on older versions of Android because onVisibilityChanged gets called from the// constructor of View so this will get called before lottieDrawable gets initialized.// https://github.com/airbnb/lottie-android/issues/1143if (lottieDrawable null) {return;}if (isShown()) {if (wasAnimatingWhenNotShown) {resumeAnimation();wasAnimatingWhenNotShown false;}} else {if (isAnimating()) {pauseAnimation();wasAnimatingWhenNotShown true;}}}当lottieview从不可见到可见时会根据wasAnimatingWhenNotShown之前记录的这个状态去resumeAnimation。在resumeAnimation方法一路跟下去最后会走到LottieValueAnimator.java的12345678910public void resumeAnimation(){running true;postFrameCallback();lastFrameTimeNs 0;if (isReversed() getFrame() getMinFrame()) {frame getMaxFrame();} else if (!isReversed() getFrame() getMaxFrame()) {frame getMinFrame();}}这里可以发现并没有像startAnimation那样的notifyXXX的回调方法了。因此我们收不到onAnimationStart的方法回调了。至此弄清楚了异常的原因如何修改就很简单了。现在已经能猜到是布局加载之后lottieview还没有渲染出来我们就去startAnimation导致回调无法走到因此我们可以通过对lottieView进行post或者通过监听viewTreeObserver的事件再进行startPlayAnimation操作就行了。四、总结1、回调方法要写完整2、如果弹框一开始就要显示lottie动画需要等ui控件可见之后再播放动画
http://www.pierceye.com/news/418470/

相关文章:

  • 专业网站制作公司塞尼铁克dw网页设计作品简单
  • 福州做网站公司有哪些中小企业网站制作塞尼铁克
  • 公司网站 钓鱼网站网站建设实训报告的内容怎么写
  • 摄影网站建设内容硬件开发语言有哪些
  • 怎么在主机上的建设网站做网站后台需要写代码吗
  • 网站建设发信息wordpress 科技类主题
  • 一站式进货平台网站建设为什么做网站编辑
  • 免费建站哪家好网站商城建设合同免费下载
  • 网站开发filter北京互联网
  • 德州市市政工程建设总公司网站设计公司的运营模式
  • 网站源码怎么弄境外注册网站
  • 肥城网站建设视频解析接口网站怎么做
  • 深圳做互联网教网站公司五百亿网站建设
  • 如何建自己网站周口网站建设费用
  • 延安网站建设哪家专业网站建设的大功效
  • 做网站交互demo工具服务器中安装wordpress
  • 2017年网站建设市场分析2345浏览器官网网址
  • 超大型网站建设怎么打广告吸引客户
  • 阳泉 网站建设合作国际网站设计
  • 东莞网站优化快速排名wordpress自适应设置宽度
  • wordpress的站点地址怎么设置青岛seo网站建设
  • wordpress 获取文章标签泰安企业网站seo
  • 网站可分为哪两种类型jsp网站建设项目实战 pdf
  • 科技类网站简介怎么做网站建设公司的工资
  • 东莞网站推广怎么做网站备案和备案的区别
  • 免费的舆情网站app开放平台设计方案
  • 昆明驿站网站建设程序做网站好还是app好
  • 提供网站推广公司电话室内设计好不好学
  • 小型网站网站建设需要做网页的素材网站
  • 圣诞节网站模板大兴企业官网网站建设