利用android开源库android-gif-drawable加载gif格式图片,,在android项目中,
利用android开源库android-gif-drawable加载gif格式图片,,在android项目中,
在android项目中,最学用的是png格式的图片,或者用jpeg的图片。那我们要用动画类型图片gif格式图片应该怎么办呢?我们可以使用android-gif-drawable框架来实现gif图片加载,下面直接贴下我在项目中用到的工具类:```javapublic class GifLoader {/保存图片引用的Map*/public static Map<ImageView, String> mImageViewMap = Collections.synchronizedMap(new HashMap<ImageView, String>());private ExecutorService executorService;/缓存大小10MiB/private static int mMemCacheMaxSize = 10 * 1024 * 1024;/LruCache缓存图片*/private static LruCache<String, byte[]> mMemLruCache;/版本号/private static int mAppVersion = 1;/硬盘缓存50M*/private static int mDiskCacheMaxSize = 50 * 1024 * 1024;/硬盘缓存对象/private static DiskLruCache mDiskLruCache;/是否要初始化*/private static boolean mCacheInit = false;private static final int DISK_CACHE_COUNT = 1;/GifLoader对象/private static GifLoader loader;/*默认一张图片的id/final int default_image_id = R.drawable.icon_app_normal;
/*构造对象/private GifLoader(Context context) {executorService = Executors.newFixedThreadPool(2);initCaches(context);}
/*单例模式/public synchronized static GifLoader getInstance(Context context) {if (loader == null) {loader = new GifLoader(context);}return loader;}
/*在控件上展示图片/public void displayImage(String url, GifImageView imageView, boolean isGif) {try {if (new File(url).exists()) {imageView.setImageDrawable(new GifDrawable(url));return;}}catch (Exception e) {}
mImageViewMap.put(imageView, url);byte[] data = mMemLruCache.get(url);if (data != null) {try {imageView.setImageDrawable(new GifDrawable(data));}catch (Exception e) {e.printStackTrace();imageView.setImageResource(default_image_id);}}else {queuePhoto(url, imageView);imageView.setImageResource(default_image_id);}
}
private void queuePhoto(String url, GifImageView imageView) {PhotoToLoad photoToLoad = new PhotoToLoad(url, imageView);executorService.submit(new PhotosLoader(photoToLoad));}
/*此方法待优化以防止内存溢出 先从文件里面读取,没有的话再到网上下载/private byte[] getBitmap(String url) {Snapshot cacheEntry = null;try {cacheEntry = mDiskLruCache.get(CacheHelper.UriToDiskLruCacheString(url));}catch (Exception e) {e.printStackTrace();}
byte[] image = null;
if (cacheEntry != null) {image = inputStreamToByteArray(cacheEntry.getInputStream(0), (int) cacheEntry.getLength(0));mMemLruCache.put(url, image);}try {if (image != null) {
return image;}else {URL imageUrl = new URL(url);HttpURLConnection con = (HttpURLConnection) imageUrl.openConnection();con.setConnectTimeout(30000);con.setReadTimeout(30000);con.setInstanceFollowRedirects(true);InputStream is = con.getInputStream();image = inputStreamToByteArray(is, 8096);if (image != null) {
try {Editor editor = mDiskLruCache.edit(CacheHelper.UriToDiskLruCacheString(url));if (editor != null) {if (CacheHelper.writeByteArrayToEditor(image, editor)) {mDiskLruCache.flush();editor.commit();}else {editor.abort();}}}catch (Exception e) {e.printStackTrace();}
mMemLruCache.put(url, image);}}
}catch (FileNotFoundException e) {e.printStackTrace();}catch (MalformedURLException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}
return image;}
private class PhotosLoader implements Runnable {private PhotoToLoad photoToLoad;
public PhotosLoader(PhotoToLoad photoToLoad) {super();this.photoToLoad = photoToLoad;}
@Overridepublic void run() {/*下载前检查imageview是否被复用/if (imageViewReused(photoToLoad)) { return; }byte[] bm = getBitmap(photoToLoad.url);
/*下载完毕后再次检查imageview是否被复用/if (imageViewReused(photoToLoad)) { return; }DisplayImageRunnable displayImageRunnable = new DisplayImageRunnable(bm, photoToLoad);Activity a = (Activity) photoToLoad.imageView.getContext();a.runOnUiThread(displayImageRunnable);
}
}
boolean imageViewReused(PhotoToLoad photoToLoad) {String tag = mImageViewMap.get(photoToLoad.imageView);/*代表imageviews map中存放的imageview对应的value值已经被覆盖掉,也就是重用了/if (tag == null || !tag.equals(photoToLoad.url)) {return true;}else {return false;}
}
private class DisplayImageRunnable implements Runnable {private byte[] data;private PhotoToLoad photoToLoad;
public DisplayImageRunnable(byte[] data, PhotoToLoad photoToLoad) {super();this.data = data;this.photoToLoad = photoToLoad;}
@Overridepublic void run() {if (imageViewReused(photoToLoad)) { return; }if (data != null) {try {photoToLoad.imageView.setImageDrawable(new GifDrawable(data));}catch (Exception e) {e.printStackTrace();photoToLoad.imageView.setImageResource(default_image_id);}}else {photoToLoad.imageView.setImageResource(default_image_id);}
}}
private class PhotoToLoad {public String url;public GifImageView imageView;
public PhotoToLoad(String url, GifImageView imageView) {super();this.url = url;this.imageView = imageView;}
}
private void initCaches(Context context) {if (!mCacheInit) {mMemLruCache = new LruCache<String, byte[]>(mMemCacheMaxSize) {protected int sizeOf(String key, byte[] value) {return value.length;}};File diskCacheDir = CacheHelper.getDiskCacheDir(context, "imagecache");try {mDiskLruCache = DiskLruCache.open(diskCacheDir, mAppVersion, DISK_CACHE_COUNT, mDiskCacheMaxSize);}catch (IOException ignored) {}mCacheInit = true;}}
private byte[] inputStreamToByteArray(InputStream is, int size) {ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();byte[] buffer = new byte[size];
int len = 0;try {while ((len = is.read(buffer)) != -1) {byteBuffer.write(buffer, 0, len);}}catch (IOException e) {e.printStackTrace();}
buffer = byteBuffer.toByteArray();return buffer;}}```
用户点评