美文网首页
Glide4 使用

Glide4 使用

作者: 太极1 | 来源:发表于2020-02-04 18:03 被阅读0次

    基本使用
    Glide.with(this).load(url).into(imageView);

    使用占位符
    占位符是当请求正在执行时被展示的 Drawable 。当请求成功完成时,占位符会被请求到的资源替换。如果被请求的资源是从内存中加载出来的,那么占位符可能根本不会被显示。如果请求失败并且没有设置 error Drawable ,则占位符将被持续展示。类似地,如果请求的url/model为 null ,并且 error Drawable 和 fallback 都没有设置,那么占位符也会继续显示。

    RequestOptions options = new RequestOptions().placeholder(R.drawable.loading);
    
    Glide.with(this).load(url).apply(options).into(imageView);
    
    

    错误占位符
    error Drawable 在请求永久性失败时展示。error Drawable 同样也在请求的url/model为 null ,且并没有设置 fallback Drawable 时展示。

    RequestOptions options = new RequestOptions()
    
            .placeholder(R.drawable.ic_launcher_background)
    
            .error(R.drawable.error);
    
    Glide.with(this).load(url).apply(options).into(imageView);
    

    后备回调符(Fallback)
    fallback Drawable 在请求的url/model为 null 时展示。

    Glide.with(fragment).load(url).fallback(R.drawable.fallback).into(view);
    

    占位符是在主线程从Android Resources加载的,且Transformation仅被应用于被请求的资源,而不会对任何占位符使用。

    指定图片大小
    使用Glide在大多数情况下我们都是不需要指定图片大小的,因为Glide会自动根据ImageView的大小来决定图片的大小,以此保证图片不会占用过多的内存从而引发OOM。

    RequestOptions options = new RequestOptions().override(200, 100);
    Glide.with(this).load(url).apply(options).into(imageView);
    

    加载图片原始尺寸

    RequestOptions options = new RequestOptions().override(Target.SIZE_ORIGINAL);
    

    缓存相关
    禁用内存缓存

    RequestOptions options = new RequestOptions().skipMemoryCache(true);
    

    禁用硬盘缓存

    RequestOptions options = new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE);
    

    硬盘缓存选项

    DiskCacheStrategy.NONE: 表示不缓存任何内容。

    DiskCacheStrategy.DATA: 表示只缓存原始图片。

    DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片。

    DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。

    DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)。

    其中,DiskCacheStrategy.DATA对应Glide 3中的DiskCacheStrategy.SOURCE,DiskCacheStrategy.RESOURCE对应Glide 3中的DiskCacheStrategy.RESULT。而DiskCacheStrategy.AUTOMATIC是Glide 4中新增的一种缓存策略,并且在不指定diskCacheStrategy的情况下默认使用就是的这种缓存策略。

    加载gif

    Picasso不支持此功能,glide会自行判断图片格式

    
    Glide.with(this).load("http://guolin.tech/test.gif").into(imageView);
    

    如果强制加载静态图片的话

    Glide.with(this).asBitmap().load("http://guolin.tech/test.gif").into(imageView);
    

    asGif()强制加载动态图

    Glide 4中又新增了asFile()方法和asDrawable()方法,分别用于强制指定文件格式的加载和Drawable格式的加载。

    过渡选项
    TransitionOptions 用于决定你的加载完成时会发生什么
    例如交叉淡入效果

    Glide.with(fragment).load(url).transition(withCrossFade()).into(view);
    

    变换选项

    RequestOptions options = new RequestOptions();
    options.centerCrop();
    

    多重变换
    默认情况下,每个 transform() 调用,或任何特定转换方法(fitCenter(), centerCrop(), bitmapTransform() etc)的调用都会替换掉之前的变换。
    如果你想在单次加载中应用多个变换,请使用 MultiTransformation 类,或其快捷方法 .transforms() 。

    Glide.with(fragment)
      .load(url)
      .transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation())
      .into(imageView);
    

    —————————————————
    apply()方法可以被调用多次,因此 RequestOption 可以被组合使用。如果 RequestOptions 对象之间存在相互冲突的设置,那么只有最后一个被应用的 RequestOptions 会生效。

    Transformation可以复用
    在多个加载中复用 Transformation 应当总是安全的
    在Glide中,当你为一个 ImageView 开始加载时,Glide可能会自动应用 FitCenter 或 CenterCrop ,这取决于view的 ScaleType 。如果 scaleType 是 CENTER_CROP , Glide 将会自动应用 CenterCrop 变换。如果 scaleType 为 FIT_CENTER 或 CENTER_INSIDE ,Glide会自动使用 FitCenter 变换。
    —————————————————

    图片url存在token

    
    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(newMyGlideUrl(url)).into(imageView);
    
    

    利用Glide将图片加载到不同控件或加载成不同使用方式
    (1)拿到图片实例

    //1、通过自己构造 target 可以获取到图片实例
    SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
        @Override
        public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
            imageView.setImageDrawable(resource);
        }
    };
    
    //2、将图片实例记载到指定的imageview上,也可以做其他的事情
    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(simpleTarget);
    }
    

    将图片加载到任何位置

    /*
    *将图片加载为控件背景
    */
    public class MyLayout extends LinearLayout {
    
        private ViewTarget<MyLayout, GlideDrawable> viewTarget;
    
        public MyLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) {
                @Override
                public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
                    MyLayout myLayout = getView();
                    myLayout.setImageAsBackground(resource);
                }
            };
        }
    
        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());
        }
    
    }
    

    ————————————————————————————

    图片预加载

    Glide.with(this).load("http://guolin.tech/book.png") .preload();
    

    preload()方法有两个方法重载,一个不带参数,表示将会加载图片的原始尺寸,另一个可以通过参数指定加载图片的宽和高。

    into()方法

    
    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);
    
    }
    
    

    submit()方法
    submit()方法其实就是对应的Glide 3中的downloadOnly()方法,和preload()方法类似,submit()方法也是可以替换into()方法的。这个方法只会下载图片,而不会对图片进行加载。当图片下载完成之后,我们可以得到图片的存储路径,以便后续进行操作。

    
    public void downloadImage() {
    
        new Thread(new Runnable() {
    
            @Override
    
            public void run() {
    
                try {
    
                    String url = "http://www.guolin.tech/book.png";
    
                    final Context context = getApplicationContext();
    
                    FutureTarget<File> target = Glide.with(context)
    
                            .asFile()
    
                            .load(url)
    
                            .submit();
    
                    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();
    
    }
    
    

    当调用了submit()方法后会立即返回一个FutureTarget对象,然后Glide会在后台开始下载图片文件。接下来我们调用FutureTarget的get()方法就可以去获取下载好的图片文件了,如果此时图片还没有下载完,那么get()方法就会阻塞住,一直等到图片下载完成才会有值返回。

    listener()方法

    
    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()方法都有一个布尔值的返回值,返回false就表示这个事件没有被处理,还会继续向下传递,返回true就表示这个事件已经被处理掉了,从而不会再继续向下传递。举个简单点的例子,如果我们在RequestListener的onResourceReady()方法中返回了true,那么就不会再回调Target的onResourceReady()方法了。

    定制变换
    尽管 Glide 提供了各种各样的内置 Transformation 实现,如果你需要额外的功能,你也可以实现你自己的 Transformation。

    BitmapTransformation
    如果你只需要变换 Bitmap,最好是从继承 BitmapTransformation 开始。BitmapTransformation 为我们处理了一些基础的东西,例如,如果你的变换返回了一个新修改的 Bitmap ,BitmapTransformation将负责提取和回收原始的 Bitmap。

    public class FillSpace extends BitmapTransformation {
        private static final String ID = "com.bumptech.glide.transformations.FillSpace";
        private static final String ID_BYTES = ID.getBytes(STRING_CHARSET_NAME);
    
        @Override
        public Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
            if (toTransform.getWidth() == outWidth && toTransform.getHeight() == outHeight) {
                return toTransform;
            }
    
            return Bitmap.createScaledBitmap(toTransform, outWidth, outHeight, /*filter=*/ true);
        }
    
        @Override
        public void equals(Object o) {
          return o instanceof FillSpace;
        }
    
        @Override
        public int hashCode() {
          return ID.hashCode();
        }
    
        @Override
        public void updateDiskCacheKey(MessageDigest messageDigest)
            throws UnsupportedEncodingException {
          messageDigest.update(ID_BYTES);
        }
    }
    

    必需的方法
    请特别注意,对于任何 Transformation 子类,包括 BitmapTransformation,你都有三个方法你 必须 实现它们,以使得磁盘和内存缓存正确地工作:

    equals()
    hashCode()
    updateDiskCacheKey
    如果你的 Transformation 没有参数,通常使用一个包含完整包限定名的 static final String 来作为一个 ID,它可以构成 hashCode() 的基础,并可用于更新 updateDiskCacheKey() 传入的 MessageDigest。如果你的 Transformation 需要参数而且它会影响到 Bitmap 被变换的方式,它们也必须被包含到这三个方法中。

    例如,Glide 的 RoundedCorners 变换接受一个 int,它决定了圆角的弧度。它的equals(), hashCode() 和 updateDiskCacheKey 实现看起来像这样:

      @Override
      public boolean equals(Object o) {
        if (o instanceof RoundedCorners) {
          RoundedCorners other = (RoundedCorners) o;
          return roundingRadius == other.roundingRadius;
        }
        return false;
      }
    
      @Override
      public int hashCode() {
        return Util.hashCode(ID.hashCode(),
            Util.hashCode(roundingRadius));
      }
    
      @Override
      public void updateDiskCacheKey(MessageDigest messageDigest) {
        messageDigest.update(ID_BYTES);
    
        byte[] radiusData = ByteBuffer.allocate(4).putInt(roundingRadius).array();
        messageDigest.update(radiusData);
      }
    

    原来的 String 仍然保留,但 roundingRadius 被包含到了三个方法中。这里,updateDiskCacheKey 方法还演示了你可以如何使用 ByteBuffer 来包含基本参数到你的 updateDiskCacheKey 实现中。

    不要忘记 equals() / hashCode()!
    值得重申的一点是,为了让内存缓存正常地工作你是否必须实现 equals() 和 hashCode() 方法。很不幸,即使你没有复写这两个方法,BitmapTransformation 和 Transformation 也能通过编译,但这并不意味着它们能正常工作。我们正在探索一些方案,以使在 Glide 的未来版本中,使用默认的 equals() 和 hashCode 方法将抛出一个编译时错误。________________________________________

    部分内容转自
    郭神 Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

    相关文章

      网友评论

          本文标题:Glide4 使用

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