本案例是基於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