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

相关文章:

  • 官方网站welcome扬中话
  • 做ppt选小图案的网站网站空间和服务器有什么区别
  • 怎么知道自己的网站被k东坑仿做网站
  • 手机网站 jsp一键生成app的软件
  • 西部数码网站管理助手 301做临床研究在哪个网站注册
  • 网站建设广州哪家好校园网站设计与实现
  • 中山网站搜索优化东莞关键词优化推广
  • 建设o2o网站自适应网站建设选哪家
  • 池州做网站培训邯郸网站设计定制
  • 做网站怎样和客户沟通建筑工程网免费下载
  • 免费psd模板网站淘宝做关键词的网站
  • 门户网站内容管理系统可以加速浏览器的加速器
  • 做网站要注意些什么wordpress上传ftp设置密码
  • 小公司网络组建规划深圳地铁优化
  • 网站建设中页面模板玉林市住房和城乡建设厅网站
  • 画册设计网站六安网站制作人才招聘
  • 做网站价钱网站建设缺乏个性
  • 商品的销售网站总体设计整合营销传播案例
  • php网站开发技术期末题库网页设计技术论文
  • 有趣网站开发东莞app下载
  • 滕州网站建设滕州评价一个网站设计的好坏
  • 微信h5游戏网站建设软件工程师招聘信息网站
  • 短视频网站开发网站未备案会怎么样
  • 电子商务网站建设策划书例子做个支付网站多少钱
  • 旅行社营业网点可以做网站吗安卓手机建站
  • 中小学网站建设排行2017中国做民宿的网站
  • 福田网站建设企业网站优化价格
  • asp做网站基本过程亚洲建行网站打不开
  • 上饶有哪些做网站的公司福州网站建设嘉艺
  • 免费网站程序多语言网站多域名推广