GLide加载图片还能这样干——基于Glide4.0完美封装

栏目: 数据库 · 发布时间: 7年前

内容简介:一个基于GLide加载图片的封装开源框架。可以监听加载图片时的进度 ,可以设置图片的圆角、边框。可加载成圆形。来自孙福生一个开源框架。项目地址为:话不多说,上我们的我们的效果图:

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

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

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

  • 1、通过提供的属性可以设置图片的圆角、边框。
  • 2、可以设置点击触摸图片时的颜色、透明度。
  • 3、一行代码加载来自网络、res、SDCard中的图片,可加载成圆形。
  • 4、可以监听加载图片时的进度。

话不多说,上我们的我们的效果图:

GLide加载图片还能这样干——基于Glide4.0完美封装

加载不同形式的图片:

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

效果图:

GLide加载图片还能这样干——基于Glide4.0完美封装

一些关键的类:

  • GlideView 对ImageView进一步的封装
  • GlideImageLoader 对Glide.load的进一步封装
  • CircleProgressView和ShapeImageView 封装加载图片的进度条

CircleProgressView和ShapeImageView是自定义ImageView,其中封装了一些自定义属性

可以在可以在代码中设置图片的一些属性, 当然这些属性也可以在GlideImageView上面设置。

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

具体属性如下

Attribute 属性 Description 描述
siv_border_color 边框颜色
siv_border_width 边框宽度
siv_pressed_color 触摸图片时的颜色
siv_pressed_alpha 触摸图片时的颜色透明度: 0.0f – 1.0f
siv_radius 圆角弧度
siv_shape_type 两种形状类型:默认是0:rectangle、1:circle

代码:

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:

GLide加载图片还能这样干——基于Glide4.0完美封装

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 缓存了原始图像,全分辨率图像和另外小版本的图像。比如,如果你请求的一个图像是 1000×1000 像素的,但你的 ImageView 是 500×500 像素的,Glide 将会把这两个尺寸都进行缓存。

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

  • DiskCacheStrategy.NONE 什么都不缓存,就像刚讨论的那样
  • DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像。在我们上面的例子中,将会只有一个 1000×1000 像素的图片
  • DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即,降低分辨率后的(或者是转换后的)
  • DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)

用 DiskCacheStrategy.SOURCE 去告诉 Glide 仅仅保存原始图片:

Glide  
    .with( context )
    .load( eatFoodyImages[2] )
    .diskCacheStrategy( DiskCacheStrategy.SOURCE )
    .into( imageViewFile );

在项目中提供了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);
}

加载进度时效果如下:

GLide加载图片还能这样干——基于Glide4.0完美封装

项目Github链接地址

https://github.com/androidstarjack/MyCircleWaveDiverge

下载慢?CSDN下载链接:

http://download.csdn.net/detail/androidstarjack/9892366


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Django 1.0 Template Development

Django 1.0 Template Development

Scott Newman / Packt / 2008 / 24.99

Django is a high-level Python web application framework designed to support the rapid development of dynamic websites, web applications, and web services. Getting the most out of its template system a......一起来看看 《Django 1.0 Template Development》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具