美文网首页Android开发
Android Glide的基本使用

Android Glide的基本使用

作者: 欢乐的乐 | 来源:发表于2017-05-15 17:38 被阅读194次

前言:

项目一直都是使用Picasso来实现图片加载和缓存,今天想试一试清除一下手机的图片缓存,发现根本找不到清除缓存的方法。
百度上很多人说Picasso.with(mContext).invalidate(uri);可以清除缓存,经过我一步一步调试和查看本地picasso-cache文件发现,这个方法清除的是内存的缓存。
要是路过的大神有解决的方法,还希望指点一下。

Thanks

本文目录(只是基本的功能)

  1. 添加依赖
  2. 权限
  3. 加载显示图片
  4. placeholder & error
  5. 设置图片尺寸(override)、裁剪(crop)
  6. 获得加载图片的大小
  7. 缓存与清除缓存

正文

1.添加依赖

目前最新的版本
compile'com.github.bumptech.glide:glide:3.7.0'

2. 权限

<uses-permission android:name="android.permission.INTERNET"/>

3. 加载显示图片

最简单的使用

Glide.with(getContext())
    .load("http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg")
    .into(imageDetail);

load()方法有多个重载,分别支持File,Byte[],String,Uri,Integer(本地资源图片)

4. placeholder & error

当加载网络图片的时候可能会比较慢,或者无网络,就可以使用placaholder展位图和error错误图友好的显示默认图片。

Glide.with(getContext())
    .load("http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg")
    .placeholder(R.drawable.default_image)
    .error(R.drawable.error_image)
    .into(imageDetail);
5. 设置图片尺寸(override)、裁剪(crop)

设置尺寸,Picasso是resize,Glide是override,参数和效果还是一样的。
默认是px喔,大家记得dp转换成px值。

Glide.with(getContext())
    .load("http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg")
    .override(500, 300)
    .into(imageDetail);

裁剪,Picasso有centerCrop(),fit(),Glide也有centerCrop(),fitCrop()
还以为效果是一样的结果发现,很不同!!
Picasso
**1. centerCrop **
充满ImageView 的边界,居中裁剪。
2. fit
充满屏幕,会拉伸。

Glide
**1. centerCrop **
等比例缩放图片,直到图片的狂高都大于等于ImageView的宽度,然后截取中间的显示。
2. fitCrop
等比例缩放图片,宽或者是高等于ImageView的宽或者是高。

项目中想图片布满整个ImageView发现Glide没有对应的方法,最后就改了ImageView的ScaleType为FIT_XY

6. 获得加载图片的大小

项目中使用PhotoView控件进行图片缩放,PhotoView当显示的图片宽度或者高度像素大于4000就要关闭硬件加速。于是加载图片后先判断图片是否像素是否大于4000,再进行显示。
(现在手机随便拍一个照片宽度或者高度都大于4000像素)

Glide.with(getContext())
    .load(url)
    .asBitmap()
    .into(new SimpleTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL){
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
            if(imageDetail != null){
                if(isBigPicture(resource.getWidth(), resource.getHeight())){
                    imageDetail.setLayerType(View.LAYER_TYPE_SOFTWARE, null);//关闭硬件加速
                }
                Glide.with(getContext())
                    .load(url)
                    .into(photoView);
            }
        }
    });
7. 缓存与清除缓存

Glide的图片缓存在/data/data/项目包名/cache/image_manager_disk_cache文件夹下
网上复制了一份清除缓存的代码,测试过是可以的

public class GlideCacheUtil {

    private static GlideCacheUtil instance;

    public static GlideCacheUtil getInstance(){
        if(instance == null){
            instance = new GlideCacheUtil();
        }
        return instance;
    }

    /**
     * 清理图片磁盘缓存
     */
    public void clearImageDiskCache(final Context context){
        try{
            if(Looper.myLooper() == Looper.getMainLooper()){
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Glide.get(context).clearDiskCache();
                    }
                }).start();
            }else{
                Glide.get(context).clearDiskCache();
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 清除图片内存缓存
     */
    public void clearImageMemoryCache(final Context context){
        try{
            if(Looper.myLooper() == Looper.getMainLooper()){
                Glide.get(context).clearMemory();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 删除指定目录下的文件,这里用于缓存的删除
     *
     * @param filePath filePath
     * @param deleteThisPath deleteThisPath
     */
    private void deleteFolderFile(String filePath, boolean deleteThisPath) {
        if (!TextUtils.isEmpty(filePath)) {
            try {
                File file = new File(filePath);
                if (file.isDirectory()) {
                    File files[] = file.listFiles();
                    for (File file1 : files) {
                        deleteFolderFile(file1.getAbsolutePath(), true);
                    }
                }
                if (deleteThisPath) {
                    if (!file.isDirectory()) {
                        file.delete();
                    } else {
                        if (file.listFiles().length == 0) {
                            file.delete();
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 清除图片所有缓存
     * 主要调用这个方法
     */
    public void clearImageAllCache(Context context) {
        clearImageDiskCache(context);
        clearImageMemoryCache(context);
        String ImageExternalCatchDir=context.getExternalCacheDir()+ ExternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR;
        deleteFolderFile(ImageExternalCatchDir, true);
    }
}

清理缓存的按钮实现clearImageAllCache(Context context)方法就好了。


好好学习,天天向上。<( ̄oo, ̄)/


Potato_zero.jpg

相关文章

网友评论

    本文标题:Android Glide的基本使用

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