美文网首页
理解 Glide3+

理解 Glide3+

作者: mouekz | 来源:发表于2018-01-23 16:27 被阅读0次

Glide介绍

Glide,一个被google所推荐的图片加载库,作者是bumptech。这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app。
与Square公司的picasso两个库的对比:
原文链接:http://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en

译文链接:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2650.html

使用

(1)导入库

在AndroidStudio(app的)上添加依赖非常简单
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
}

Glide 也支持 Maven 项目形式:
<dependency>
<groupId>com.github.bumptech.glide</groupId>
<artifactId>glide</artifactId>
<version>3.7.0</version>
</dependency>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>support-v4</artifactId>
<version>r7</version>
</dependency>

Eclipse使用去下载Glide的jar在项目中使用就可以了,jar的链接https://github.com/bumptech/glide/releases

(2)基本使用

ImageView imageView = (ImageView) findViewById(R.id.imageView);
Glide.with(context)
.load(url)
.placeholder(R.drawable.place_image)//图片加载出来前,显示的图片
.error(R.drawable.error_image)//图片加载失败后,显示的图片
.into(imageView);

图片缓存
  • 内存缓存是 Glide 默认开启的,除非你不需要,可以调用skipMemoryCache(true) 取消内存缓存。
  • 磁盘缓存也是默认开启的,也是可以关闭的 .diskCacheStrategy(DiskCacheStrategy.NONE ) 将内存缓存和磁盘缓存都禁用.

DiskCacheStrategy 的枚举意义:
DiskCacheStrategy.NONE 什么都不缓存
DiskCacheStrategy.SOURCE 只缓存全尺寸图
DiskCacheStrategy.RESULT 只缓存最终的加载图
DiskCacheStrategy.ALL 缓存所有版本图(默认行为)

自定义磁盘缓存
使用 DiskCacheStrategy 可以为 Glide 配置磁盘缓存

缩略图

Glide 为缩略图提供了2种不同的加载方式,比较简单的方式是调用 thumbnail() 方法,参数是 float 类型,作为其倍数大小。
加载多个图片,Glide 可以调用 .priority() 方法配合 Priority 枚举来设置图片加载的优先级。
Glide.with( context )
.load( url )
.thumbnail( 0.2f )
.priority (Priority.HIGH ) // Priority.LOW / Priority.NORMAL / Priority.HIGH / Priority.IMMEDIAT
.into( imageView );

加载动画效果

动画效果可以让图片加载变得更加的平滑,crossFade() 方法强制开启 Glide 默认的图片淡出淡入动画,crossFade() 有一个重载方法 crossFade(int duration)。可以控制动画的持续时间,单位ms。
Glide.with( context )
.load( url )
.crossFade()//或者使用 dontAnimate() 关闭动画
.thumbnail( 0.2f )
.into( imageView );

图片截切

Glide 也提供了两个类似的方法 CenterCrop() 和 FitCenter(),CenterCrop() 方法是将图片按比例缩放到足矣填充 ImageView 的尺寸,但是图片可能会显示不完整;而 FitCenter() 则是图片缩放到小于等于 ImageView 的尺寸,这样图片是显示完整了,但可能ImageView 就不会填满了
Glide.with( context )
.load( url )
.override(width,height) //这里的单位是px
.thumbnail( 0.2f )
.into( imageView );

显示 Gif 和 Video

显示 GIf 对于 Glide 来说一个比较特别的功能(至少 Picasso 暂时还不行)而且使用起来非常简单
String gifUrl = "http://i2.mhimg.com/M00/0E/AE/CgAAilTPWJ2Aa_EIACcMxiZi5xE299.gif";
Glide.with( context )
.load( gifUrl )
.asGif()
.error( R.drawable.error )
.into( imageView );
如果你想显示 Gif 但只是向现实静态的图片你就可以这么做
Glide.with( context )
.load( gifUrl )
.asBitmap()
.error( R.drawable.error )
.into( imageView );
仅仅是显示 Gif 的第一帧图像,这样就可以保证图片的正常显示了。

SimpleTarget
  private SimpleTarget<Bitmap> mSimpleTarget = new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> animation) {
    mImageView.setImageBitmap(resource);
}

};

private void loadImageSimpleTarget() {
Glide.with( thi s)
.load( mUrl )
.asBitmap()
.into( mSimpleTarget );
}

创建了一个 SimpleTarget 的对象并且实现了 onResourceReady() 方法,看方法名能知道是图片加载完之后会调用该方法,参数就有我们需要的 Bitmap 。
改变图片的大小,当原尺寸 1000x1000 的图片,我们显示的时候只需要是 500x500 的尺寸来节省时间和内存,你可以在 SimpleTarget 的回调声明中指定图片的大小。

  private SimpleTarget<Bitmap> mSimpleTarget = new SimpleTarget<Bitmap>(500,500) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> animation) {
    mImageView.setImageBitmap(resource);
}

};

ViewTarget

当我们使用 Custom View 时,Glide 并不支持加载图片到自定义 view 中的,使用 ViewTarget 更容易实现。

  public class CustomView extends FrameLayout {
  private ImageView mImageView;

public CustomView(Context context) {
    super(context);
}

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    mImageView = new ImageView(getContext());
    addView(mImageView , LayoutParams.MATCH_PARENT , LayoutParams.MATCH_PARENT);
}

public void setImage(Drawable drawable){
    mImageView.setImageDrawable(drawable);
}

}

上面这个例子就没有办法直接使用 .into() ,如果我们使用 ViewTarget 实现呢!

public void loadImageTarget(Context context){
CustomView mCustomView = (CustomView) findViewById(R.id.custom_view);

ViewTarget viewTarget = new ViewTarget<CustomView,GlideDrawable>( mCustomView ) {
    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
        this.view.setImage(resource);
    }
};

Glide.with(context)
        .load(mUrl)
        .into(viewTarget);
}

在 target 的 onResourceReady 回调方法中使用自定义 view 自己的方法去设置图片,可以看到在创建 ViewTarget 的时候传入了 CustomView 的对象。

Transformations

图片显示之前我们可能还需要对图片进行处理操作,比如:图片切圆角,灰阶处理等等;这些需求我们通过 Transformations 操作 bitmap 来实现,我们可以修改图片的任意属性:尺寸,范围,颜色,像素位置等等。
fitCenter 和 centerCrop ,这两个是 Glide 已经实现的

public class RoundTransformation extends BitmapTransformation {
      private float radius = 0f;

 public RoundTransformation(Context context) {
     this(context, 4);
}

public RoundTransformation(Context context, int px) {
    super(context);
    this.radius = px;
}

@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
    return roundCrop(pool, toTransform);
}

private Bitmap roundCrop(BitmapPool pool, Bitmap source) {
    if (source == null)
        return null;

    Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
    if (result == null) {
        result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
    }

    Canvas canvas = new Canvas(result);
    Paint paint = new Paint();
    paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
    paint.setAntiAlias(true);
    RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
    canvas.drawRoundRect(rectF, radius, radius, paint);
    return result;
}

@Override
public String getId() {
    return getClass().getName() + Math.round(radius);
}

}

Modules篇

Glide 的 Module 是一个可以全局改变 Glide 的行为的东西,为了定制 Glide 的行为我们要去实现 interface GlideModule 来写我们自己的代码。
先看看 GlideBuilder 中可用的方法:
.setMemoryCache(MemoryCache memoryCache)
.setBitmapPool(BitmapPool bitmapPool)
.setDiskCache(DiskCache.Factory diskCacheFactory)
.setDiskCacheService(ExecutorService service)
.setResizeService(ExecutorService service)
.setDecodeFormat(DecodeFormat decodeFormat)

  public class AppModule implements GlideModule{

       @Override
        public void applyOptions(Context context, GlideBuilder builder) {
          //在 Android 中有两个主要的方法对图片进行解码:ARGB_8888 和RGB_565 。前者为每个像素使用4个字节,后者每个像素仅使用2个字节
          builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
      }

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

}

可以看到 GlideModule 为我们提供了两个方法,这里我们主要使用的是 applyOptions(Context context, GlideBuilder builder) , 我们自己的需要重新定义的代码写在该方法里就可以了。然后我们还需要去 AndroidManifest.xml 中使用 meta 声明我们上面实现的 Module

<application>
    <meta-data
       android:name="com.mrtrying.demoglide.module.ExampleModule"
        android:value="GlideModule" />
</application>

到这里我们就完成了 ExampleModule 的声明,Glide 将会在工作是使用我们所定义的 Module

相关文章

  • 理解 Glide3+

    Glide介绍 Glide,一个被google所推荐的图片加载库,作者是bumptech。这个库被广泛运用在goo...

  • 理解!理解!!理解!!!

    1、如何理解MVC设计模式 MVC是一种架构模式,M表示MOdel,V表示视图View,C表示控制器Control...

  • 理解“理解”

    教育不是灌输而是揭示 教育就是向智者揭示智慧,对愚者掩盖无知。——安布罗斯 比尔斯 我们的课堂教学要做的是设计表现...

  • 理解理解,再理解

    【今日悦读】 1214-潇潇 书名:财富自由之路 作者:李笑来 篇目:10~12节 收获: 1,人生三大坑 莫名其...

  • 理解不被理解

    一个人的坐在电脑前发呆,不知道搞什么,闭上眼睛,感觉自己很孤独。这种是内心的那种,很不是滋味,不知道什么时候自己才...

  • 理解你的理解理顺理解

    理解你的理解理顺你的理解 生活中因为缺乏准确具体到位的沟通和具体的实施方向和可落地的方式,因为信息传达...

  • 理解不理解

    对于更多人而言,或许他们更看重的是对与错,是与非。这种执念而且经常让一些人变了味,甚至格格不入。 而对于个人而言,...

  • 理解不曾理解的

    上学时从来没把容貌当成大事儿,只是希望脸上的痘痘能少点,至于什么皮肤白、毛孔粗大、黑眼圈、肤色暗淡、脸型、眉形、眼...

  • 理解与被理解

    凡事都设身处地为别人着想,自己不愿做的事情也不强加给别人,理解的核心在于不自我。

  • 理解什么是理解

    《理解什么是理解》-花花 每个人都渴望被理解,希望被理解,不被理解是一件很痛苦的事情。 小朋友不理解妈妈为对自己反...

网友评论

      本文标题:理解 Glide3+

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