美文网首页
Glide 使用

Glide 使用

作者: Jiun俊 | 来源:发表于2018-05-04 09:23 被阅读0次

    文章都是参考郭霖的Glide系列的个人总结,更加方便与个人的使用的查找。

    Glide 4 相较于 Glide 3 变动的主要是变动规则。性能上并没有什么突破性的升级,更多的是在 API 方便的优化,使之更加易读、易写、易扩展……
    引入了 RequestOptions 对象,将一系列的 API 都移动到了 RequestOptions 中,可以摆脱冗长的 Glide 加载语句,还能进行自己的 API 封装。RequestOptions 可以作为参数传入到方法中。

    RequestOptions options 
          = new RequestOptions()
          .transforms()
          .placeholder(R.drawable.place_holder)
          .error(R.drawable.error)
          // 可以指定加载图片的大小,不让 Glide 根据控件大小来决定图片大小
          .override(200,200)
          // 加载原图,Glide 不会自动压缩,容易 OOM
          .override(Target.SIZE_ORIGINAL)
          // 缓存策略默认开启,禁用方法
          .skipMemoryCache(true)
          // 禁用掉 Glide 的缓存功能
          .diskCacheStrategy(DiskCacheStrategy.NONE);
    
    Glide.with(this)
            .asXxx() // asGif / asFile / asBitmap / asDrawable
            .load(url)
            .apply(options)
            .listener()
            // .preload
            // .submit()
            .into(ImageView / Target);    
    

    缓存策略:

    Glide 分为内存缓存和硬盘缓存。

    内存缓存 主要作用是防止应用重复将图片数据读取到内存中;
    硬盘缓存 的只要作用是防止应用重复中网络或其他地方重复下载和读取数据。

    .diskCacheStrategy()方法可以接收五种参数:

    • DiskCacheStrategy.NONE:不缓存任何内容
    • DiskCacheStrategy.DATA: 只缓存原始图片
    • DiskCacheStrategy.RESOURCE: 只缓存转换后的图片
    • DiskCacheStrategy.ALL:
    • DiskCacheStrategy.AUTOMOTIC: 默认选项,让 Glide 根据图片资源智能选择使用哪种策略。

    指定加载格式

    Glide 可以自动识别 gif 图,并展示。
    如果指定格式需要调用 asBitmap() / asGif() 方法。
    Glide 4 中还增加了 asFile() / asDrawable(),分别用于强指定文件格式和加载和 Drawable 格式的加载。

    // Glide 4中 asXxx() 必须在 load() 前面。
    Glide.with(this).asXxx().load();
    

    回调与监听

    1. into()

    into() 参数可以指定为 Target

    SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() { 
        @Override 
        public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) { 
            imageView.setImageDrawable(resource); 
        } 
    }; 
    
    public void loadImage(View view) { 
        Glide.with(this) 
             .load("http://guolin.tech/book.png") 
             .into(simpleTarget); 
    }
    

    2. preload()

    希望提前对图片进行一个预加载。有两个方法重载。一个可以指定图片大小。

    // 图片预加载
    Glide.with(this) 
         .load("http://guolin.tech/book.png") 
         .preload();
    
    // 预加载图片的真正加载 
    Glide.with(this) 
         .load("http://guolin.tech/book.png") 
         .into(imageView);
    

    3. submit()

    用于下载图片,不能预加载。关于图片缓存的路径、访问获取缓存文件的方法。
    对应 Glide 3 中的 downloadOnly()
    submit() 可以替换 into()
    也有两个重载方法:

    • submit()
    • submit(int width, int height); // 指定大小
    new Thread(new Runnable() { 
            @Override 
            public void run() { 
                try { 
                    String url = "http://www.guolin.tech/book.png"; 
                    // 此处 context 使得 下载任务跟随应用的生命周期,防止 Activity 销毁而任务被取消。
                    final Context context = getApplicationContext(); 
                    // submit 返回一个 FutureTarget 对象,进行异步加载。
                    FutureTarget<File> target = Glide.with(context) 
                            .asFile() // 指定加载格式
                            .load(url) 
                            .submit();
                    // 如果图片未加载完,就会阻塞在 get()  
                    final File imageFile = target.get(); 
                    runOnUiThread(new Runnable() { 
                        @Override 
                        public void run() { 
                            Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show(); 
                        } 
                    }); 
                } catch (Exception e) { 
                    e.printStackTrace(); 
                } 
            } 
        }).start(); 
    
    

    4. listener()

    用来监听 Glide 加载图片的状态。

    Glide.with(this) 
         .load("http://www.guolin.tech/book.png") 
         .listener(new RequestListener<Drawable>() { 
             @Override 
             public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { 
                 return false; 
             } 
    
             @Override 
             public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { 
                 return false; 
             } 
         }) 
         .into(imageView);
    

    onResourceReady() / onLoadFailed() 的 Boolean 返回值:
    表示事件是否已被处理,如果返回 true 则 不会再回调 Target 的 onResourceReady 方法 了。

    图片变换 transforms()

    对原始图片进行一些变换处理后展示给用户,包括 圆角化、圆形化、黑白化、模糊化 (高斯模糊) 等等

    Github 上有个很好的库 glide-transformations

    RequestOptions options = new RequestOptions() 
            .transforms(...); 
           // 有一些内置的变换 API 
            .centerCrop() / .fitCenter() / .circleCrop()
    Glide.with(this) 
         .load(url) 
         .apply(options) 
         .into(imageView);
    

    高级技巧 - 自定义模块

    可以将 更改 Glide 配置,替换 Glide 组件等操作独立出来。可以对 Glide 进行自定义,并且和 Glide 的图片加载逻辑没有任何交集,也是一种低耦合编程方式的体现。

    首先,定义一个自己的模块类,extend APPGlideModule

    @GlideModule 
    public class MyAppGlideModule extends AppGlideModule { 
    
        @Override 
        public void applyOptions(Context context, GlideBuilder builder) { 
                // TODO: 用来更改Glide配置
        } 
    
        @Override 
        public void registerComponents(Context context, Glide glide, Registry registry) { 
                // TODO: 替换Glide组件
        } 
    }
    

    相关文章

      网友评论

          本文标题:Glide 使用

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