本案例是基于Volley网络库实现的加载多种网络图片,目前包括GIF动态图片、圆形图片、普通图片,还有待完善,欢迎提意见,或者一块儿完成。android
对于Volley,我相信咱们都使用过,它也是Google推荐的网络加载框架,性能优秀。另外,咱们也知道Volley能够加载网络图片,正常状况下,可使用ImageRequest的用法、ImageLoader的用法和NetworkImageView的用法来加载网络图片。可是,有时候咱们项目中加载图片可能须要不一样的需求,因此我就在这基础上修改完成了加载多样化的网络图片的功能。固然如今Glide加载图片也是很是的好,Google也推荐了。git
Github项目地址,欢迎star,欢迎一块儿完善github
Volley中图片请求操做主要与ImageLoad与ImageRequeat这两个文件有关系,可是其中返回的是Bitmap对象,咱们要修给使得返回缓冲区的ByteBuffer流。以下:缓存
public interface ImageCache { ByteBuffer getBitmap(String url); void putBitmap(String url, ByteBuffer bitmap); }
具体的写法与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); } }
主要判断是否为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); }
最后,要感谢koral--本文的GIF图片显示库,就是这位大神的。koral--的Github
Gif图片加载采用koral--实现的android-gif-drawable ,此库底层使用C库进行Gif的编解码,效率和显示效果方面都很是棒。ide