当前位置: 首页 > 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.yutouwan.com/news/240447/

相关文章:

  • 哈尔滨网站建设多少钱wordpress导航 t
  • 长沙智能建站方案高端定制网站的特点
  • 商务咨询公司网站制作模板教育网站开发文档
  • 网站安全优化yum wordpress php扩展
  • 做淘宝客网站公司法人查询
  • wordpress 网站搬迁上海定制网站建设公司
  • 重庆有网站公司君通网站怎么样
  • 甘州区建设局网站做网站公司排名电话
  • 做个网站怎么赚钱罗湖、龙华、龙岗最新通告
  • 免费网站模板 带后台wordpress插件直播
  • 梧州网站制作基于html5的电商网站开发
  • 鞋行业的网站建设什么是电商平台推广
  • 诸葛企业网站建设公司树莓派做网站服务器怎样
  • 仿朋友圈网站建设站长统计app进入网址新版小猪
  • 潍坊高端网站开发做网站毕业设计能过吗
  • 联想粒子云可以做网站公司网站被抄袭
  • 网站模板和源码区别福州专业做网站的公司有哪些
  • 做一个官方网站需要多少钱中国新闻发布
  • 做平面有什么好的网站网站网页制作及优化
  • 网站的首页需要什么内容谷歌浏览器引擎入口
  • 在淘宝上做的网站要转出简历制作免费模板网站
  • 永久免费素材网站wordpress加入购买功能
  • 服装加盟的网站建设淘宝客优惠券网站建设教程视频
  • 查关键词热度的网站seo站长工具推广平台
  • 江津网站建设公司网站原型是什么
  • 网站关键词优化seo关键词之间最好用逗号微信小程序登陆入口
  • 做网站需要多少职务百事可乐运用了哪种网络营销方式
  • 张掖网站建设培训福建省建设执业资格注册中心网站
  • 北京网站排名方案学校网站代码
  • 网站建设的理由浏览器大全列表