当前位置: 首页 > news >正文

基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...

基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)

本案例是基于Volley网络库实现的加载多种网络图片,目前包括GIF动态图片、圆形图片、普通图片,还有待完善,欢迎提意见,或者一起完成。

前言

对于Volley,我相信我们都使用过,它也是Google推荐的网络加载框架,性能优秀。另外,我们也知道Volley可以加载网络图片,正常情况下,可以使用ImageRequest的用法、ImageLoader的用法和NetworkImageView的用法来加载网络图片。但是,有时候我们项目中加载图片可能需要不同的需求,所以我就在这基础上修改完成了加载多样化的网络图片的功能。当然现在Glide加载图片也是非常的好,Google也推荐了。

Github项目地址,欢迎star,欢迎一起完善

图片描述

1、修改ImageLoad与ImageRequeat

Volley中图片请求操作主要与ImageLoad与ImageRequeat这两个文件有关系,但是其中返回的是Bitmap对象,我们要修给使得返回缓冲区的ByteBuffer流。如下:

public interface ImageCache {
        ByteBuffer getBitmap(String url);
        void putBitmap(String url, ByteBuffer bitmap);
    }

2、基于LruCache实现内存缓存

具体的写法与Volley使用ImageLoad时缓存类似

public class LruImageCache extends LruCache<String, ByteBuffer> implements ImageLoader.ImageCache {
    
    public LruImageCache(int maxSize) {
        super(maxSize);
    }
    
    @Override
    protected int sizeOf(String key, ByteBuffer value) {
        return value.capacity();
    }
    
    @Override
    public ByteBuffer getBitmap(String url) {
        return get(url);
    }

    @Override
    public void putBitmap(String url, ByteBuffer bitmap) {
        put(url, bitmap);
    }
}

3、新建一个AsyncTask从缓存中数据流到UI显示图片

主要判断是否为GIF图片,如果是则加载,另外还要判断是否为圆形图片,如果是则加载

            // 判断是否为GIF图片,如果是则加载
            if ( LoadGif.isGif(mImageView, bytes) )
                return;

            Bitmap image = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            //判断是否为圆形图片,如果是则加载
            if(isCircle){
                mImageView.setImageBitmap(LoadGif.toRoundBitmap(image));
            }else{
                mImageView.setImageBitmap(image);
            }

4、感谢

最后,要感谢koral--本文的GIF图片显示库,就是这位大神的。koral--的Github
Gif图片加载采用koral--实现的android-gif-drawable ,此库底层使用C库进行Gif的编解码,效率和显示效果方面都非常棒。

相关文章:

  • Scrum4.0
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 打印出100到999的水仙花数
  • HDOJ/HDU 2568 前进(简单题)
  • java实现上传图片进行切割
  • XNA游戏开发之滚动背景
  • Java程序中添加播放MIDI音乐功能
  • string与char*的转换(转载)
  • OSSIM远程连接与文件传输图示
  • android studio修改项目包名
  • 每天一个linux命令(18):locate 命令
  • android微信支付
  • 13 款惊艳的 Node.js 框架——第1部分
  • shell学习笔记2---awk字符串处理(原创)
  • 各主流浏览器的区别
  • 收藏网友的 源程序下载网
  • 【Amaple教程】5. 插件
  • CSS 三角实现
  • express.js的介绍及使用
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • jQuery(一)
  • KMP算法及优化
  • Laravel核心解读--Facades
  • Redis字符串类型内部编码剖析
  • 大主子表关联的性能优化方法
  • 关于Flux,Vuex,Redux的思考
  • 坑!为什么View.startAnimation不起作用?
  • 你真的知道 == 和 equals 的区别吗?
  • 配置 PM2 实现代码自动发布
  • 小程序01:wepy框架整合iview webapp UI
  • 学习笔记:对象,原型和继承(1)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二)fiber的基本认识
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .libPaths()设置包加载目录
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .Net 知识杂记
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET中的Exception处理(C#)
  • /etc/skel 目录作用
  • @Query中countQuery的介绍
  • @RequestMapping 的作用是什么?
  • @RestController注解的使用
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [Android]如何调试Native memory crash issue