美文网首页Android开发Android View
Glide 加载gif的一些个人总结

Glide 加载gif的一些个人总结

作者: LichFaker | 来源:发表于2016-04-13 23:18 被阅读33366次

    说明

    最近项目中有使用到gif动画,加上本身已经引入了Glide 3.7.0(支持gif)库,所以便用Glide来加载了;但在使用过程中还是遇到了不少困难, 在此记录下,希望可以给遇到类似问题的你一些思考和建议。

    简单使用

    如果你还不了解Glide库, 可移步https://github.com/bumptech/glide
    同加载普通图片一样,使用如下代码即可加载gif动画

    Glide.with(this).load(...).asGif().into(...)
    

    需要注意的是如果加载的图片不是gif,则asGif()会报错, 当然,asGif()不写也是可以正常加载的。

    Gif动画播放的一些控制

    1. 有的时候我们需要控制动画的播放次数,而默认的加载则是循环播放的,而Glide也没有开放单独的api接口用来控制gif,这时可以通过GlideDrawableImageViewTarget(view, int)来实现, 其中第二个参数表示播放的次数:
    Glide.with(this).load(...).into(new GlideDrawableImageViewTarget(iv, 1));
    
    • 如果需要监听动画播放完成呢?我的思路是添加一个RequestListener,获取加载的gif的播放时间time,延时time时长后发起播放结束消息,大致可以实现播放的监听。完整例子如下:
    Glide.with(this).load(R.drawable.third_animation).listener(new 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) {
            Observable.just(resource)
                    .flatMap(new Func1<GlideDrawable, Observable<?>>() {
                        @Override
                        public Observable<?> call(GlideDrawable glideDrawable) {
                            int duration = 0;
                            try {
                                GifDrawable gifDrawable = (GifDrawable) glideDrawable;
                                GifDecoder decoder = gifDrawable.getDecoder();
                                for (int i = 0; i < gifDrawable.getFrameCount(); i++) {
                                    duration += decoder.getDelay(i);                            }
                            } catch (Throwable e) {
                            }
                            return Observable.just(null).delay(duration, TimeUnit.MILLISECONDS);
                        }
                    })
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.io())
                    .subscribe(new Action1<Object>() {
                        @Override
                        public void call(Object o) {
                            // 加载完成后的处理...
                        }
                    });
            return false;
        }}).into(new GlideDrawableImageViewTarget(welcomeGif2, 1));
    

    别再评论说代码报错了

    好多个同学都留言说代码有问题,GlideDrawableImageViewTarget报错...遇到错误先排查下自己代码有没有问题...附代码截图:

    相关文章

      网友评论

      • lllllittlep:当Gilid.加载动态调用asGif的时候,(new GlideDrawableImageViewTarget(iv, 1)),编译都不通过,加载正常的图片是可以的.你上面的演示都没有加asGif,不知道怎么截图
      • 240b50cbfcf3:(new GlideDrawableImageViewTarget(iv, 1));这句报错啊
        240b50cbfcf3:@LichFaker into()里面需要的是ImageView对象
        LichFaker:@T摩天倫 增加了代码截图,遇到报错先定位问题,然后解决, 而不是在这评论。。。
      • 23b112a2983f:关于在listView Item中加载,复用Cell之后,如何不让之前的glide下载的图片into到ImageView中
        23b112a2983f:@LichFaker gif比较大,如果我对下载过程使用 .listener监听,在onResourceReady中关闭转菊花。但是asGif()就不能使用了;
        LichFaker:@Guooo into中用 BitmapImageTarget 或者 Drawable ImageViewTarget 代替即可
        23b112a2983f:有监听办法吗?
      • 萧喃: @Override
        public void onBindViewHolder(MyGifRecyclerViewAdapter.MyHolder holder, final int position) {
        Log.e(TAG, " ---头像路径-->>>"+ gifsBeens.get(position).getFixed_height_url());
        Glide.with(mContext)
        .load(gifsBeens.get(position).getFixed_height_url())
        // .centerCrop()
        //.fitCenter()
        // .transform(new GlideCircleTransform(mContext))
        .placeholder(R.drawable.load_ing)
        .error(R.mipmap.default_pic1)
        .skipMemoryCache(true)
        .diskCacheStrategy(DiskCacheStrategy.SOURCE)
        .crossFade()
        .into(holder.imageView);
        }
        用recycleView加载gif图片,快速滚动出现OOm怎么解决?
        萧喃:@LichFaker 能方便加个qq聊一下吗?
        萧喃:@LichFaker Glide.with(context).pauseRequests()没有这个pauseRequests这个方法?在哪里设置?
        LichFaker:@GoChat 如果只是滚动会出现OOM,试下Glide.with(context).pauseRequests(), 滚动停止时resume
      • z_ym:Glide.with(this).load(...).into(new GlideDrawableImageViewTarget(iv, 1));
        这样写不行啊,编译都不通过
        z_ym:@LichFaker 这是我使用的Glide的版本, compile 'com.github.bumptech.glide:glide:3.7.0'
        z_ym:@LichFaker 是图片的url:String,可是连编译都不通过,我也纳闷 :joy:
        LichFaker:@z_ym load参数是图片uri, 你具体报错是什么? 正常是没问题的
      • JiaJJ:你好,请问如何实现圆角的gif,asGif()方法会和transform()方法冲突,你有解决方法吗
        LichFaker: @JiaJJ Sorry,我没有遇到过你说的这问题,也没研究。不过Fresco是可以的

      本文标题:Glide 加载gif的一些个人总结

      本文链接:https://www.haomeiwen.com/subject/qbkglttx.html