Android深入

Glide4.0以上异步加载图片跟监听Gif加载监听

2020-04-03  本文已影响0人  陈陈_04d0

/**

  * 设置圆形new CircleCrop(),这里可以根据不同需求自定义圆角

  */

Glide.with(this).load(url).apply(RequestOptions.bitmapTransform(new CircleCrop())).into(new CustomTarget<Drawable>() {

            @Override

            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {

                user_head_photo.setImageDrawable(resource);

            }

            @Override

            public void onLoadCleared(@Nullable Drawable placeholder) {

            //从任何视图中删除onResourceReady中提供的绘图,并确保没有对它的任何引用。

            }

        });

/**

* Gif 加载 可以设置次数,监听播放完成回调

* @param context    上下文对象

* @param model      传入的gif地址,可以是网络,也可以是本地,

* @param imageView  要显示的imageView

* @param loopCount  播放次数

* @param gifListener Gif播放完毕回调

*/

public void  loadGif(Context context, Object model, final ImageView imageView, int loopCount, final GifListener gifListener){

Glide.with(context).asGif().load(model).listener(new RequestListener() {

@Override

            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {

return false;

            }

@Override

            public boolean onResourceReady(GifDrawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {

try {

Field gifStateField = GifDrawable.class.getDeclaredField("state");

                    gifStateField.setAccessible(true);

                    Class gifStateClass = Class.forName("com.bumptech.glide.load.resource.gif.GifDrawable$GifState");

                    Field gifFrameLoaderField = gifStateClass.getDeclaredField("frameLoader");

                    gifFrameLoaderField.setAccessible(true);

                    Class gifFrameLoaderClass = Class.forName("com.bumptech.glide.load.resource.gif.GifFrameLoader");

                    Field gifDecoderField = gifFrameLoaderClass.getDeclaredField("gifDecoder");

                    gifDecoderField.setAccessible(true);

                    Class gifDecoderClass = Class.forName("com.bumptech.glide.gifdecoder.GifDecoder");

                    Object gifDecoder = gifDecoderField.get(gifFrameLoaderField.get(gifStateField.get(resource)));

                    Method getDelayMethod = gifDecoderClass.getDeclaredMethod("getDelay", int.class);

                    getDelayMethod.setAccessible(true);

                    ////设置播放次数

                    resource.setLoopCount(loopCount);

                    //获得总帧数

                    int count = resource.getFrameCount();

                    int delay =0;

                    for (int i =0; i < count; i++) {

                   //计算每一帧所需要的时间进行累加

                        delay += (int) getDelayMethod.invoke(gifDecoder, i);

                    }

imageView.postDelayed(() -> {

if (gifListener !=null) {

gifListener.gifPlayComplete();

                        }

}, delay +200);//设置动画加载完停留最后一贞200毫秒

                }catch (NoSuchFieldException | InvocationTargetException | NoSuchMethodException | IllegalAccessException | ClassNotFoundException e) {

e.printStackTrace();

                }

return false;

            }

}).into(imageView);

    }

/**

* Gif播放完毕回调

*/

    public interface GifListener {

   void gifPlayComplete();

    }

}

}

上一篇下一篇

猜你喜欢

热点阅读