Android

Glide学习笔记

2017-01-16  本文已影响2406人  i冰点

来自于 Glide - 开始!

1、依赖:

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

2、基本使用:

    Glide.with(context) //参数Activity/Fragment
                        //设置路径
                        .load(circleItem.getPics())
                        //缓存策略,缓存最终图片
                        .diskCacheStrategy(DiskCacheStrategy.RESULT)
                        //占位图
                        .error(R.drawable.ic_default_img).placeholder(R.drawable.ic_default_img)
                        //动画
                        .crossFade()
                        //调整图片像素大小
                        .override(320,  320)
                        //目标图片进行裁剪
                        .fitCenter().into(((ItemViewHolder) holder).img);

其中几个方法:

1、CenterCrop()和fitCenter()
分别对应ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER。

2、硬盘缓存diskCacheStrategy():

如果已经缓存过全尺寸图片,则根据全尺寸图片进行调整,不用重新下载了

3、override
如果没有为图片指定尺寸(override),默认会以View的大小去限制图片的大小

3、特点:

4、一些方法

1、关于downloadOnly、preload

Glide.with(this).load(url)
        .downloadOnly(Target.SIZE_ORIGINAL,Target.SIZE_ORIGINAL);
Glide.with(this).load(url)
        .diskCacheStrategy(DiskCacheStrategy.RESULT).fitCenter()
        .preload(260,260);

downloadOnly仅仅进行硬盘缓存(缓存SOURCE),preload进行硬盘和内存缓存

downloadOnly、preload

参考:Difference between downloadOnly() and preload()Is that downloadOnly not cache the image?

2、 Glide 中的回调:Targets
Glide 提供了各种的 targets ,可以在 Glide 做完网络请求和处理之后,在这里得到返回的结果。

    private SimpleTarget<Bitmap> simpleTarget=new SimpleTarget<Bitmap>(200,200) {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
        }
    };

加载图片到RelativeLayout中

    private ViewTarget<RelativeLayout, GlideDrawable> viewTarget=new ViewTarget<RelativeLayout, GlideDrawable>(bgContainer) {
        @Override
        public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
            this.view.setBackground(resource.getCurrent());
        }
    };
    Glide.with(getActivity()).load(R.drawable.ic_main_bg).diskCacheStrategy(DiskCacheStrategy.NONE)
            .into(viewTarget);

注意:
1、在into()方法中,不要使用匿名内部类:在 Glide 做完图片请求之前, Android 垃圾很可能会回收这个匿名内部类对象,最终这可能会导致,当图像加载完成了,但是回调再也不会被调用。
2、使用SimpleTarget<Bitmap>时,需要为target指定一个尺寸

参考: Glide之Target

3、用 GlideModule自定义 Glide

public class ConfigurationGlide implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // 设置别的get/set tag id,以免占用View默认的,Glide的3.6.0可以
        ViewTarget.setTagId(R.id.glide_tag_id);

        /*
        内存缓存
        Glide提供了一个类MemorySizeCalculator,用于决定内存缓存大小以及 bitmap 的缓存池。
        bitmap 池维护了你 App 的堆中的图像分配。
        正确的 bitmpa 池是非常必要的,因为它避免很多的图像重复回收,这样可以确保垃圾回收器的管理更加合理。
        它的默认计算实现
        */
        MemorySizeCalculator memorySizeCalculator = new MemorySizeCalculator(context);
        int defaultMemoryCacheSize = memorySizeCalculator.getMemoryCacheSize();
        int defaultBitmapPoolSize = memorySizeCalculator.getBitmapPoolSize();
        builder.setMemoryCache(new LruResourceCache((int) (defaultMemoryCacheSize*1.2f)));
        builder.setBitmapPool(new LruBitmapPool((int) (defaultBitmapPoolSize * 1.2f)));

        /*
        磁盘缓存
        Glide图片缓存有两种情况,一种是内部磁盘缓存另一种是外部磁盘缓存。
        我们可以通过 builder.setDiskCache()设置,并且Glide已经封装好了两个类实现外部和内部磁盘缓存,
        分别是InternalCacheDiskCacheFactory和ExternalCacheDiskCacheFactory
         */
        //磁盘缓存100M,默认250M
        builder.setDiskCache(new InternalCacheDiskCacheFactory(context, 100 * 1024 * 1024));
        //builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,100*1024*1024));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }
}

磁盘缓存可以位于应用的私有目录(除了它自己,没有别的应用可以访问),也可以位于外部存储,不能一起设置这两个

<meta-data android:name="com.hqgj.shareimgtransition.common.ConfigurationGlide" android:value="GlideModule"/>

参考: android学习之路(一)--Glide学习

尽量不要使用太大的图片,一般页面上图片显示多大就把图片设置成多大,如果是后台上传的图片,可以使用组件把图片生成缩略图,如ASPJPEG上传组件。

4、为不同的分辨率设备,加载不同尺寸的图片

需要使用我们自己的ModeLoader(.using(new MyUrlLoader(this))),加载自己的数据源(.load(T model)),如下:

    Glide.with(this).using(new MutImgUrlLoader(this))
            .load(new MutImgDataModel() {
                @Override
                public String buildUrl(int width, int height) {
                    if(width>=1440){
                        return result.getImg()+ ThumbnailUtil.IMG1440;
                    }else if(width>=1080){
                        return result.getImg()+ThumbnailUtil.IMG1080;
                    }else if(width>=720){
                        return result.getImg()+ThumbnailUtil.IMG720;
                    }else if(width>=480){
                        return result.getImg()+ThumbnailUtil.IMG480;
                    }else {
                        return result.getImg()+ThumbnailUtil.IMG1080;
                    }
                }
            })
            .asBitmap()
            .transform(new GlideCircleTransform(this))
            .error(R.mipmap.ic_launcher)
            .animate(animator)
            .into(new BitmapImageViewTarget(imageView){
                @Override
                protected void setResource(Bitmap resource) {
                    super.setResource(resource);
                }
            });

实现自定义的ModelLoader,继承BaseGlideUrlLoader

public class MutImgUrlLoader extends BaseGlideUrlLoader<MutImgDataModel> {
    public MutImgUrlLoader(Context context) {
        super(context);
    }
    @Override
    protected String getUrl(MutImgDataModel model, int width, int height) {
        return model.buildUrl(width,height);
    }
}

自定义数据源:

public interface MutImgDataModel {
    public String buildUrl(int width, int height);
}

这样,我们在高分率的设备上加载大图的url1,在低分辨率的设备上加载小图url2。从而实现了根据不同手机上的像素值大小加载不同尺寸的图片的需求。

参考:使用Glide加载图片系列之一从不同的数据源加载图片

5、集成网络库
用 Glide 集成一个网络库,需要一个 Glide 的 ModeLoader 的接口。为了让你更加易用,Glide 为2个网络库提供了实现: OkHttp 和 Volley 。
Volley

dependencies {
  ...
  // Glide
  compile 'com.github.bumptech.glide:glide:3.6.1'
  // Glide's Volley Integration
  compile 'com.github.bumptech.glide:volley-integration:1.3.1@aar'
  compile 'com.mcxiaoke.volley:library:1.0.8'
}

这将添加 Volley 并集成该库到你的项目中。集成库添加GlideModule 到你的 Android.Manifest 。Glide 会自动认出它,然后使用 Volley 作为网络库。并不要求做其他的配置!

参考:Glide - 集成网络栈

6、取消缓存
取消内存缓存(在主线程中调用)

Glide.get(this).clearMemory();

7、在listview中加载高度不固定图片,加载刷新图片跳动解决?
为啥高度不固定的时候会闪烁呢,应该跟图片高度不同有关,在更新listview时候,会去重新计算listview高度,绘制item,不同高度图片会重新计算.

8、-实现滚动加载,不滚动时不加载
Glide.with(context).resumeRequests()/Glide.with(context).pauseRequests()

参考:
Android图片库--Glide Wiki中文翻译图片加载框架Glide解析对比Picasso内存占用Yelp app是如何使用Glide优化图片加载的Glide的使用大法与内伤治疗方案

上一篇 下一篇

猜你喜欢

热点阅读