因为项目需要加载gif动态图。上网查了一下 发现都是介绍Glide去加载动态图的。刚开始还觉得Glide挺好的。可以实现加载动态图。也可以监听加载完后的状态 设置原来的普通图片。后来发现Glide加载大的gif图很慢。后来又发现加载本地图片的时候。Glide不能设置加载完的监听了。发现了android-gif-drawable 这个框架 。发现挺好用的。速度比Glide快很多。是用jni加载的。不会出现内存泄漏。

现在先说Glide加载的方法 : Glide和picasso很像 ( 先加入仓库 )

compile 'com.github.bumptech.glide:glide:3.7.0'

.placeholder()是还未加载出来的普通占位图片   .load()加载的是gif图片
Glide.with(MainActivity.this).load(R.drawable.e).placeholder(R.drawable.a).diskCacheStrategy(DiskCacheStrategy.SOURCE).listener(new TimeListener()).into(new GlideDrawableImageViewTarget(imageView,1);
class TimeListener implements RequestListener<Integer, GlideDrawable> {
      @Override
      public boolean onException(Exception e, Integer model, Target<GlideDrawable> target, boolean isFirstResource) {
          return false;
      @Override
      public boolean onResourceReady(GlideDrawable resource, Integer model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
          // 计算动画时长
          GifDrawable drawable = (GifDrawable) resource;
          GifDecoder decoder = drawable.getDecoder();
          long duration = 0;
          for (int i = 0; i < drawable.getFrameCount(); i++) {
              duration += decoder.getDelay(i);
              Log.e("MainActivity", "for " + duration);
          //发送延时消息,通知动画结束
          Log.e("MainActivity", "onResourceReady: " + duration);
          handler.sendEmptyMessageDelayed(MESSAGE_SUCCESS, duration + 500);
          return false;
  }
TimeListener 这个内部类就是监听gif图片播放的内部类 onResourceReady()这个方法经过我测试只能监听到一次播放完毕  不管new GlideDrawableImageViewTarget(view,num) num设置几次 都是显示一次gif图片就结束了。注意如果只监听 GlideDrawableImageViewTarget(view,num)这个方法。那么播放num次数后就会停止在播放结尾上。我们想停止在gif图片的开头。所以就加了TimeLIstener这个监听。但是这个监听好像只能监听1次播放完毕。发送消息到主线程的handler里处理。勉强达到需求。

这是加载Drawable里面的资源。后来想加载本地的资源。还是用Glide试试。

Glide.with(MainActivity.this).load("file:///"+Environment.getExternalStorageDirectory()+"/updateFlag/d.gif").placeholder(R.drawable.a).diskCacheStrategy(DiskCacheStrategy.SOURCE).listener(new TimeListener()).into(gifImageView);
加载本地图片的时候 listener(new TimeListener()) 方法报错了 。就是这个播放完的监听不顶用了。
Glide.with(MainActivity.this).load("file:///"+Environment.getExternalStorageDirectory()+"/updateFlag/c.gif").placeholder(R.drawable.a).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView);
最后只好把这个监听给去掉了。然后就只能停在尾部了。播放次数还是可以设置。注意Glide加载本地图片的时候 必须加  "file:///"  否则会找不到资源的的。

出现这个问题后就想找一个别的方法。就发现了android-gif-drawable这个框架。这个框架也不大。但是加载gif图片的时候速度很快。也可以加载比较大的gif图片 超过5m的大图片。

android-gif-drawable也是先加入仓库  这个jar包很小的

compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.10'
导入这个项目后可以用第三方定义的gif控件
<pl.droidsonroids.gif.GifImageView
    android:id="@+id/iv"
    android:visibility="visible"
    android:background="@drawable/a"
    android:scaleType="fitXY"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
这个控件的父类就是ImagView .ImageView的属性都可以用
GifImageView gifImageView=findViewById(R.id.iv);
这个里面有一个GifDrawable gifDrawable; 这个对象很重要,播放gif就依靠这个对象。看代码。
                        gifImageView.setImageURI(Uri.parse("file:///" + Environment.getExternalStorageDirectory() + "/updateFlag/b.gif"));
//                        gifImageView.setImageResource(R.drawable.b);
                        gifDrawable = (GifDrawable) gifImageView.getDrawable();
                        gifDrawable.start();
                        gifDrawable.setLoopCount(1);
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                handler.obtainMessage(1, "ok").sendToTarget();
                        }, gifDrawable.getDuration());
加载本地资源 还是需要加 “file:///” +path   gifDrawable这个对象控制gif图片的播放和播放次数。然后根据gifDrawable.getDuration()得到播放时长。发送消息去主线程控制gifImageView设置默认图片。加载资源文件 被注释了 方开就好。

加载网络gif图片没有验证。Glide 大家很熟悉 直接load(网络url) 。这个android-gif-drawable 加载网络图片我没有验证。估计就是将网络图片读为inputstream 让后用控件加载就好。这个有兴趣的童鞋请自己研究一下。

因为项目需要加载gif动态图。上网查了一下 发现都是介绍Glide去加载动态图的。刚开始还觉得Glide挺好的。可以实现加载动态图。也可以监听加载完后的状态 设置原来的普通图片。后来发现Glide加载大的gif图很慢。后来又发现加载本地图片的时候。Glide不能设置加载完的监听了。发现了android-gif-drawable 这个框架 。发现挺好用的。速度比Glide快很多。是用jni加载的。不 主页:http://code.google.com/p/ gif view/ 下载:http://code.google.com/p/ gif view/downloads/list 简介: android 中现在没有直接显示 gif 的view,只能通过media pl ay来显示,且还常常
背景项目有个需求:对 GIF 动图实时添加文字。 结合之前FollowMe景区导游助手项目中做过图片添加水印,MovieMaker项目中多张图片合成一段具有多种切换效果视频的经验,预测需要对 GIF 文件的数据进行解码,合成处理,编码输出合成文件。 项目基于 Glide 库实现 GIF 图片的显示,因此需要搞清楚 GIF 文件的数据是怎么显示到ImageView模块。本文记录分析 Gif Drawable 模块的原理的过程
Glide 图片 框架 是可以直接 加载 GIF 图的,但是做一个银行合作项目的时候,由于有需要出货页面需要 加载 一个 GIF 图,但是发现在使用 Glide 框架 加载 Gif 图片,明显发现有延迟. 经过查看 glide 加载 Gif 图片的源码得知: Glide 在 加载 Gif 的图片帧的时候,上一帧的渲染以及下一帧的准备是串行的,这个过程中,如果出现下一帧的准备阶段时间超过了 Gif 间隔播放的时长,就会造成播放卡顿.而且此过程中,Standard Gif Decode r只保留上一帧的数据,每次获取当前需要绘制的帧的时候都会从BitmapP
return EncodeStrategy.SOURCE override fun encode(data: Resource< Gif Drawable ?>, file: File, options: Options): Boolean { var success = false if (data is Gif Lib Drawable Resource) { val byteBuffer = data.buffer try { ByteBuf ferUtil.toFile(byteBuffer,
1. 首先,您需要下载 Glide -3.7.0.jar文件并将其保存在您的项目文件夹中。 2. 在 Android Studio中,右键单击您的项目文件夹,然后选择“Open Module Settings”。 3. 在“Modules”选项卡中,选择您的应用程序模块,然后单击“Dependencies”选项卡。 4. 单击“+”按钮,然后选择“File dependency”。 5. 在弹出的对话框中,选择您刚刚下载的 Glide -3.7.0.jar文件。 6. 单击“OK”按钮,然后单击“Ap pl y”按钮。 7. 现在,您已经成功添加了 Glide -3.7.0.jar 框架 ,可以在您的项目中使用它了。