加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

利用android开源库android-gif-drawable加载gif格式图片

发布时间:2020-12-15 03:22:59 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 ? ? ? 在android项目中,最学用的是png格式的图片,或者用jpeg的图片。那我们要用动画类型图片gif格式图片应该怎么办呢?我们可以使用android-gif-dra

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

? ? ? 在android项目中,最学用的是png格式的图片,或者用jpeg的图片。那我们要用动画类型图片gif格式图片应该怎么办呢?我们可以使用android-gif-drawable框架来实现gif图片加载,下面直接贴下我在项目中用到的工具类:
public 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;
}


@Override
public 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;
}


@Override
public 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,len);
}
}
catch (IOException e) {
e.printStackTrace();
}


buffer = byteBuffer.toByteArray();
return buffer;
}
}

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读