Android工具

GLide加载图片你这样玩过吗——基于Glide4.0完美封装

2018-04-18  本文已影响268人  流船

前言

一个基于GLide加载图片的封装开源框架。可以监听加载图片时的进度 ,可以设置图片的圆角、边框。可加载成圆形。

来自孙福生一个开源框架。项目地址为:https://github.com/sfsheng0322/GlideImageView

该库是基于Glide V4.0设计的,实现如下特性:

image.png

加载不同形式的图片:

   public void loadLocalImage(@DrawableRes int resId, int placeholderResId) {
        load(resId, requestOptions(placeholderResId));
    }

    public void loadLocalImage(String localPath, int placeholderResId) {
        load(FILE + localPath, requestOptions(placeholderResId));
    }

    public void loadCircleImage(String url, int placeholderResId) {
        load(url, circleRequestOptions(placeholderResId));
    }

    public void loadLocalCircleImage(int resId, int placeholderResId) {
        load(resId, circleRequestOptions(placeholderResId));
    }

    public void loadLocalCircleImage(String localPath, int placeholderResId) {
        load(FILE + localPath, circleRequestOptions(placeholderResId));
    }

效果图:

image.png

一些关键的类:

eg:

// 设置边框颜色
public void setBorderColor(@ColorRes int id) {
this.borderColor = getResources().getColor(id);
invalidate();
}

// 设置边框宽度
public void setBorderWidth(int borderWidth) {
this.borderWidth = DisplayUtil.dip2px(getContext(), borderWidth);
invalidate();
}

// 设置图片按下颜色透明度
public void setPressedAlpha(float pressAlpha) {
this.pressedAlpha = pressAlpha;
}

// 设置图片按下的颜色
public void setPressedColor(@ColorRes int id) {
this.pressedColor = getResources().getColor(id);
pressedPaint.setColor(pressedColor);
pressedPaint.setAlpha(0);
invalidate();
}

具体属性如下

image.png

代码:

  image41.load(cat_thumbnail, requestOptions).listener(new OnGlideImageViewListener() {
        @Override
        public void onProgress(int percent, boolean isDone, GlideException exception) {
            if (exception != null && !TextUtils.isEmpty(exception.getMessage())) {
                Toast.makeText(getApplicationContext(), exception.getMessage(), Toast.LENGTH_LONG).show();
            }
            progressView1.setProgress(percent);
            progressView1.setVisibility(isDone ? View.GONE : View.VISIBLE);
        }
    });

加载gif:

image.png

GLide的缓存策略:

内存缓存

让我们想象一个非常简单的请求,从网络中加载图片到 ImageView。

Glide  
.with( context )
.load( eatFoodyImages[0] )
.skipMemoryCache( true )
.into( imageViewInternet );

调用了 .skipMemoryCache(true) 去明确告诉 Glide 跳过内存缓存。这意味着 Glide 将不会把这张图片放到内存缓存中去。这里需要明白的是,这只是会影响内存缓存!Glide 将会仍然利用磁盘缓存来避免重复的网络请求

跳过磁盘缓存

图片在这段代码片段中将不会被保存在磁盘缓存中。然而,默认的它将仍然使用内存缓存!为了把这里两者都禁用掉,两个方法一起调用:

Glide  
.with( context )
.load( eatFoodyImages[0] )
.diskCacheStrategy( DiskCacheStrategy.NONE )
.skipMemoryCache( true )
.into( imageViewInternet );

自定义磁盘缓存行为

Picasso 仅仅缓存了全尺寸的图像。然而 Glide 缓存了原始图像,全分辨率图像和另外小版本的图像。比如,如果你请求的一个图像是 1000x1000 像素的,但你的 ImageView 是 500x500 像素的,Glide 将会把这两个尺寸都进行缓存。

现在你将会理解对于 .diskCacheStrategy() 方法来说不同的枚举参数的意义:

在项目中提供了GlideImageLoader类加载图片,比如这样加载图片:先加载缩略图再加载高清图片,并监听加载的进度

private void loadImage(String image_url_thumbnail, String image_url) {
RequestOptions requestOptions = glideImageView.requestOptions(R.color.black)
        .centerCrop()
        .skipMemoryCache(true) // 跳过内存缓存
        .diskCacheStrategy(DiskCacheStrategy.NONE); // 不缓存到SDCard中

glideImageView.getImageLoader().setOnGlideImageViewListener(image_url, new OnGlideImageViewListener() {
    @Override
    public void onProgress(int percent, boolean isDone, GlideException exception) {
        progressView.setProgress(percent);
        progressView.setVisibility(isDone ? View.GONE : View.VISIBLE);
    }
});

glideImageView.getImageLoader().requestBuilder(image_url, requestOptions)
        .thumbnail(Glide.with(ImageActivity.this) // 加载缩略图
                .load(image_url_thumbnail)
                .apply(requestOptions))
        .transition(DrawableTransitionOptions.withCrossFade()) // 动画渐变加载
        .into(glideImageView);
 }
上一篇下一篇

猜你喜欢

热点阅读