前天项目中用到gif图做支付状态显示,支付中、支付失败或成功这3个gif。本来打算要美工(当着美工的面要称呼他们叫UI设计师)做帧图片,然后自己做动画的,后来发现项目里用到了Fresco(做头像用的,我也是刚接触项目一个月,之前不知道)。并且Fresco自带支持gif和webP的。然后就用起来了,下边是我遇到的问题,跟大家分享一下
使用方法,这个就不赘述了,Fresco的api文档写的非常好,而且直接中文版,不用英语二把刀去查github和stackoverflow了。
大致就是导包,初始化,xml布局,代码实现四步。需要注意的几点是:导包时如果像我一样用到了gif
一定要导入下边这个 compile 'com.facebook.fresco:animated-gif:0.12.0',否则gif图压根不动,当时我都一脸懵逼了,各种百度各种google花了整整一下午加一晚上时间。最后从头去读Fresco的API才找到这个原因,顺便吐槽一下网上Fresco的资料也太少了吧,所以我写这个也是造福大众。
第二点要注意的是初始化的时候在oncreate中,我是写到application的oncreate中的,看别人帖子说要初始化在activity的话貌似必须写到setcontentview方法前,我也没试,反正application的oncreate没有setcontentview。
第三点是布局里边SimpleDraweeView的宽高不支持wrapcontent,这个在api和其他帖子都有说,包括xmlns的添加都说的很清楚,就不给大家贴了。
第四点和第一点都是非常重要的,至少对我来说是的。下边大篇幅介绍,要使用animatable的话按照Fresco的文档应该是这样
Animatable animatable = mSimpleDraweeView.getController().getAnimatable(); if (animatable != null) { animatable.start(); // later animatable.stop(); }
然而我这使用中发现不论如何,我取到的animtable一直都是空的null。怕getanimtable时候controller没加载完gif,还写了线程等一段时间再get,但是也不可以。最后我是这么解决的。独家秘方
声明全局变量animtable,然后添加文档中的这个方法
ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() { @Override public void onFinalImageSet( String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) { if (anim != null) { // 其他控制逻辑 anim.start(); } } };
实现将anim赋值给animtable就有值了,下边是我的代码
controllerListener = new BaseControllerListener<ImageInfo>() { @Override public void onFinalImageSet( String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) { if (anim != null) { // 其他控制逻辑 anim.start(); animatable = anim; } } };
mSimpleDraweeView.getController().getAnimatable()=null的问题就解决了