Glid4简单使用

图片加载框架Glid V4基本使用

使用 Generated API

Glide 4 使用注解处理器 (Annotation Processor) 来生成出一个 API,在 Application 模块中可使用该流式 API 一次性调用到 RequestBuilder, RequestOptions 和集成库中所有的选项。

1.添加Glide注解依赖

    repositories {
      mavenCentral()
    }

    dependencies {
      annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
    }

2.合适地方实现AppGlideModule

    @GlideModule
    public final class MyAppGlideModule extends AppGlideModule {}

实现类必须使用@GlideModule注解,如果没有注解将无法找到Module,第一次添加Module实现类,需要rebuild项目,如果Module实现类做了修改,也需要rebuild项目,在build完成后会自动生新类,之后的加载图片可以使用GlideApp类来进行操作如:

    GlideApp.with(fragment)
        .load(myUrl)
        //占位图
        .placeholder(R.drawable.placeholder)
        //加载转换类型
        .fitCenter()
        //.circleCrop() 圆形图片
        .into(imageView);

与Glide.with(fragment)不同,GlideApp.with(fragment)一些方法直接可以调用如fitCenter,placeholder,不需要单独传入RequestOptions

不使用 Generated API

在不使用API来进行操作,可以新建RequestOptions和apply来实现占位图等操作

//变换操作默认给出了fitCenter(), centerCrop(), bitmapTransform()等,在多次调用转换时会替换掉之前的转换类型,如果想使用多重转换,需要使用 MultiTransformation类

RequestOptions requestOptions = new RequestOptions()
            //占位图
            .placeholder(R.drawable.load_fail)              
            //图片转换类型多种类型,也可以自定义类型
            .transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation())
            //系统默认的几个转换类型
            //fitCenter(), centerCrop(), bitmapTransform()
            //失败回调图
            .fallback(R.drawable.load_fail);

//设置完后需要调用apply来应用requestOptions

Glide.with(this)
        .load(R.drawable.screen)
        .apply(requestOptions).
        //默认已实的现过渡动画,渐隐渐现
        .transition(DrawableTransitionOptions.withCrossFade())
        .into(imageView);

//或者直接设置系统默认的几种转换类型
Glide.with(this)
        .load(R.drawable.screen)
        //应用默认类型
        .apply(RequestOptions.fitCenterTransform())
        //.apply(RequestOptions.circleCropTransform())
        //默认已实现的过渡动画,渐隐渐现
        .transition(DrawableTransitionOptions.withCrossFade())
        .into(imageView);

如果直接设置了ImageView的大小尺寸,则占位图不会影响图片的加载变化但图片背景会出现在加载结果中;没有设置ImageView固定尺寸,而是设置了占位图,占位图的尺寸直接影响第一次加载完成后图片的尺寸,因此设置占位图时一定要设置与你要加载的图片尺寸大小接近的,否则会影响图片加载效果,如果不是特别要求,可以不设置占位图,以免影响图片加载效果,占位图的高度比实际图形高度高,第一次加载时会导致图片被纵向拉伸

Glide过渡的使用

如果想使图片加载完成占位图到加载的图片之间不显的那么突兀,可以使用过渡.可以使用RequestBuilder的transition()方法来指定过渡,但过渡动画比较耗时,在列表或网格列表中使用时,可能会导致图片加载缓慢,因此在ListView,GridView和RecyclerView中需要考虑避免使用过渡动画.

加载过程使用过渡动画常见错误,Glide默认禁用了交叉淡入,实际使用时如果占位图比实际的图片要大,或者实际图片部分透明时,禁用交叉淡入会导致动画完成后占位符图片仍然可见如图:

Glide加载圆形图片时,已经处理了四角的透明,但由于占位图设置的背景,导致占位图没有消失,仍然显示

解决的办法就是调整DrawableCrossFadeFactory参数讲结果设置到 transition()中,具体代码

//开启交叉淡入
  DrawableCrossFadeFactory build = new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build();
//设置给transition()
 Glide.with(this)
            .load(R.drawable.screen)
            .apply(requestOptions)
            //这里设置了修改参数后的结果
            .transition(DrawableTransitionOptions.withCrossFade(build))
            .into(imageView);
或者
 GlideApp.with(this)
            .load()
            //这里设置了修改参数后的结果
            .transition(DrawableTransitionOptions.withCrossFade(build))
            .fitCenter()
            .circleCrop()
            .placeholder(R.drawable.load_fail)
            .error(R.drawable.load_fail)
            .into(imageView);

过渡的效果也可以自定义,实现 TransitionFactory,使用 DrawableTransitionOptions.with** 来将你自定义的 TransitionFactory 应用到加载中。就像上面修改了淡入开启的方法相同DrawableTransitionOptions.withCrossFade(自定义的TransitionFactory类)

在ListView和RecyclerView中使用

Glide会自动处理View的复用和请求的取消,即使url为null也不需要担心,Glide会清空图片或者显示设置的占位图或失败回调图;如果复用的view在之前位置上Glide加载过图片,那么在新位置上要去知悉给一个新的加载操作或者调用clear()停止Glide的操作(这是官方的解释,不是很懂意思,)

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    if (isImagePosition(position)) {
         String url = urls.get(position);
            Glide.with(fragment)
            .load(url)
            .into(holder.imageView);
    } else {
        Glide.with(fragment).clear(holder.imageView);
        holder.imageView.setImageDrawable(specialDrawable);
    }
}

其实onBindViewHolder方法只要滚动条目,是一直会被调用的,每次调用都会去执行Glide的加载图片操作,因此在设置和部分时按照正常使用就可以了;测试中发现问题,如果在RecyclerVeiw条目布局中只引用了ImageView来做为根标签时,使用Glide加载图片时会报错,提示setTag()问题,这是因为Glide根据tag来判断加载,防止列表中图片加载错乱,如果是只有ImageView,不设置tag的情况下会报错,解决方法

  1. 在使用Glide加载图片前先设置ImageView.setTag(null)
  2. 在ImageView外部包裹一层布局,RelativeLayout或者LinearLayout或者FrameLayout

第一次写博客,谢谢大家抽空阅读,不对和不足的地方希望能够指出来,谢谢支持.

猜你喜欢

转载自blog.csdn.net/u012237341/article/details/81634921