Glide用法总结

1.基本使用方法:

Glide.with(this)//设置上下文对象,可以是context、activity、fragment、fragmentActivity、v4包下的fragment,
                  Glide的生命周期与这个对象一致
        .load(url)//加载的路径,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等
        .asBitmap()//Glide会自动判断图片类型,支持显示gif类型的图片,如果加上这句话则只允许加载静态图片,不显示动图
        .asGif()//与上面的方法相对应,只允许显示动图,如果此时加载图片是静态图则会显示错误图片
        .placeholder(R.drawable.loading)//占位图,即正式图片未加载完成时显示的图片
        .error(R.drawable.error)//错误图片,即加载失败后显示的图片
        .diskCacheStrategy(DiskCacheStrategy.NONE)//禁用硬盘缓存,NONE是不缓存、SOURCE只缓存原始图、
                                                    RESULT只缓存转换过的图片(默认选项)、ALL缓存原始图+转换过的图片
        .override(100, 100)//指定图片大小,表示100*100的图片像素尺寸
        .skipMemoryCache(true)//禁用内存缓存,默认内存缓存是开启的
        .into(imageView);//设置显示容器


2.Glide的一些特性:

Glide与初始化时给定的context的生命周期保持一致,即activity处于可见状态时才加载图片,不可见时停止加载图片,如果context是applicationContext类型则生命周期与application保持一致。


Glide会自动判断imageview的大小,来决定加载到内存中图片的大小。

Glide支持内存和硬盘缓存,不过缓存key值由多种条件决定,其中就包括了宽高,所以不一样宽高的同一张图片会被多次下载缓存,如果不想这样可以只缓存原图来避免。

Glide的内存缓存正在使用的图片使用map+WeakReference缓存,其他使用LRUCache缓存。硬盘缓存使用的是DiskLruCache。


3.Glide的高级用法:

1)当图片的url地址会随一定原因改变时,会导致缓存对应的key不断变化,从而导致Glide的缓存机制失效。解决方法,创建一个MyGlideUrl继承GlideUrl重写getCacheKey()方法使得getCacheKey的返回值固定不变,从而使得缓存key固定不变,则可以解决这个问题,例如:


如果我们的图片地址是这样的(从七牛云上得到的),其中token值可变:

http://url.com/image.jpg?token=d9caa6e02c990b0a

public class MyGlideUrl extends GlideUrl {

    private String mUrl;

    public MyGlideUrl(String url) {
        super(url);
        mUrl = url;
    }

    @Override
    public String getCacheKey() {
        return mUrl.replace(findTokenParam(), "");
    }

    private String findTokenParam() {
        String tokenParam = "";
        int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
        if (tokenKeyIndex != -1) {
            int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
            if (nextAndIndex != -1) {
                tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
            } else {
                tokenParam = mUrl.substring(tokenKeyIndex);
            }
        }
        return tokenParam;
    }

}

使用方法:

Glide.with(this)
        .load(new MyGlideUrl(url))
        .into(imageView);

2.Glide直接获取图片的方法,into方法中除了可以传入imageview还可以传入其他的Target类型的参数,Target的子类很多通常只需在两种Target的基础上去自定义就行,一种是SampleTarget,一种是ViewTarget。

1)SampleTarget的使用方法(不显示出来,直接获取图片):

//如果你的图片类型确定,则GlideDrawable也可以写成Bitmap
SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {    
   @Override    
   public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {        
      imageView.setImageDrawable(resource);//resource就是Glide获取到的图片
       }
};

2)ViewTarget的使用方法(自定义view使用Glide加载图片):

需要创建自定义view,这里我们创建一个自定义布局MyLayout:

public class MyLayout extends LinearLayout {

    private ViewTarget<MyLayout, GlideDrawable> viewTarget;

    public MyLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        //如果你的图片类型确定GlideDrawable也可以替换成Bitmap
       viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) {
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
                MyLayout myLayout = getView();
                myLayout.setImageAsBackground(resource);//resource就是Glide获取到的图片
            }
        };
    }

    public ViewTarget<MyLayout, GlideDrawable> getTarget() {
        return viewTarget;
    }

    public void setImageAsBackground(GlideDrawable resource) {
        setBackground(resource);
    }

}

public class MainActivity extends AppCompatActivity {

    MyLayout myLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myLayout = (MyLayout) findViewById(R.id.background);
    }

    public void loadImage(View view) {
        String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
        Glide.with(this)
                .load(url)
                .into(myLayout.getTarget());
    }

}

3.preload()方法,预加载,即不调用into方法实现图片的缓存

Glide.with(this)
        .load(url)
 .diskCacheStrategy(DiskCacheStrategy.SOURCE)//必须使用SOURCE类型,保证图片宽高一致,不会产生多个key
 .preload();
预加载后使用图片:

Glide.with(this)
        .load(url)
 .diskCacheStrategy(DiskCacheStrategy.SOURCE)//必须使用SOURCE类型,保证图片宽高一致,不会产生多个key
 .into(imageView);

4.downloadOnly方法,直接获取到缓存文件的方法

1)downloadOnly(int width, int height)只能在子线程中使用,会得到一个FutureTarget类型的对象,FutureTarget.get()可以获得File对象,举例:

public void downloadImage(View view) {
    new Thread(new Runnable() {//开启子线程
        @Override
        public void run() {
            try {
                String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
                final Context context = getApplicationContext();
                FutureTarget<File> target = Glide.with(context)
                        .load(url)
                        .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);//获取FutureTarget对象
                final File imageFile = target.get();//获取File对象
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();//显示文件路径
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}

2)downloadOnly(Y Target)可以在主线程获取File对象,但要自己实现Target子类。

实现Target子类,只需要实现getSize()方法和onResourceReady()方法,其他方法不重要:

public class DownloadImageTarget implements Target<File> {

   private static final String TAG = "DownloadImageTarget";

   @Override
   public void onStart() {
   }

   @Override
   public void onStop() {
   }

   @Override
   public void onDestroy() {
   }

   @Override
   public void onLoadStarted(Drawable placeholder) {
   }

   @Override
   public void onLoadFailed(Exception e, Drawable errorDrawable) {
   }

   @Override
   public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) {
      Log.d(TAG, resource.getPath());//这里的resource就是获取的图片文件
   }

   @Override
   public void onLoadCleared(Drawable placeholder) {
   }

   @Override
   public void getSize(SizeReadyCallback cb) {

      //Glide在加载图片前会先计算图片大小,这个工作就交给我们在这里实现了,Target.SIZE_ORIGINAL表示图片的原始尺寸
      cb.onSizeReady(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);   
   }    
   
   @Override    
   public void setRequest(Request request) {  
      
   }    
   
   @Override    
   public Request getRequest() {        
      return null;    
   }
}

使用方法:

public void downloadImage(View view) {
    String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
    Glide.with(this)
            .load(url)
            .downloadOnly(new DownloadImageTarget());
}

5.listener方法,用来监听加载成功还是失败

public void loadImage(View view) {
    String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
    Glide.with(this)
            .load(url)
            .listener(new RequestListener<String, GlideDrawable>() {
                @Override
                public boolean onException(Exception e, String model, Target<GlideDrawable> target,
                                           boolean isFirstResource) {//加载成功时的回调
                    return false;//这里一定要是false否则事件不向下传递,即不会执行into方法
                }

                @Override
                public boolean onResourceReady(GlideDrawable resource, String model,
                                               Target<GlideDrawable> target, boolean isFromMemoryCache,
                                              boolean isFirstResource) {//加载失败异常时的回调
                    return false;//同上
                }
            })
            .into(imageView);
}

这篇文章是我根据郭霖大神解析Glide系列总结的基础使用方法和特性,如果想看源码分析的可以去大神博客看Android图片加载框架最全解析(一),Glide的基本用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值