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

在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, 0, len);

}

}

catch (IOException e) {

e.printStackTrace();

}

buffer = byteBuffer.toByteArray();

return buffer;

}

}

时间: 2024-10-11 20:43:11

利用android开源库android-gif-drawable加载gif格式图片的相关文章

VC下加载多种格式图片的方法总结IPicture, CxImage, CImage(AtlImage), CPictureEx

尽管VC有提供相应的API和类来操作bmp位图.图标和(增强)元文件,但却不支持jpg.gif和png等格式的图片,而这几种格式却是常常要用到的.这里我给大家介绍两种办法来操作这些格式的图片. 1.用API OleLoadPicture来加载JPG.GIF格式的图片(注:不支持PNG格式,另外GIF只能加载第一帧,且不支持透明) OleLoadPicture 函数实际上创建了一个IPicture类型的COM接口对象,然后我们可以通过这个COM接口来操作图片(实际上你也可以用API OleCrea

Glide终于解决了同时加载webp格式图片的问题

前端时间,要给项目换个图片加载的库,使用Glide 3.7版本进行测试, 发现在快速滑动列表(每个item都会加载一个app的图标,采用webp格式,即同时加载多个webp格式)的时候,一屏至少有2-3个出现加载失败的情况(看LOG), 加载单个的webp格式是OK的: 但是采用png是OK的:后来只好采用picasso来加载图片, 现在项目需要加载Gif图片,所以又想到了glide. 今天用Glide 4.0.0版本进行测试,列表加载webp格式是OK了. 当然Glide 4.0.0 相比 3

弄明白android网络库之Volley listView加载大量图片

一.加载一张图片 Volley是通过ImageRequest来获取网络上的图片的,指定一个URL,返回一个已经编码号的bitmap.当然它也提供了其他便利特性,比如调整图片大小.使用它它主要的好处是 Volley的计划线程确保了如图片编码.调整大小等昂贵的操作自动地在一个工作线程完成,不会给主线程带来太多的麻烦和干扰. a cannedrequest for getting an image at a given URL and calling back with a decodedbitmap

为什么Android应该根据屏幕分辨率来加载不同的图片文件

1.图片在xxhdpi,手机是hdpi的 我们有一个手机是hdpi的.我们还有一个图片,我们把他放在xxhdpi下.当手机显示的时候,系统会去hdpi中找,发现没有图片,最终在xxhpi中找到.终于找到图片后,系统会觉得xxhdpi中的图片一定很大,而我要把它显示在hdpi的手机中的话就应该压缩下图片,最终成为了原图的1/4,而压缩后的图片会损失一些东西,就会造成模糊的情况.这样的坏处也是显而易见的,显示到手机的图片资源清晰度下降,模糊了很多. 2.图片在dpi,手机是hdpi的 系统先去hdp

【Android Demo】加载.gif格式图片

Android系统为了节省内存,一般不支持直接显示gif图片,即使你强制设置了,也只会显示图片的第一帧. 这个 Demo 是在网上看到的,是个思路,还是有些局限性,还是记录下,以后研究吧. 1.效果图: 2.实现原理: 通过解码gif图片形成多张静态图,然后通过线程和imageView来实现循环播放 3.准备GIF图片 4.详细代码 <1>工具类:CommonUtil.java package com.yanis.tools; import java.io.InputStream; impor

(android开源库android-gif-drawable)第二篇 加载网络gif图片

大家好,  今天给大家带来如何使用 android开源库android-gif-drawable来 加载网络gif图片 同样的DEMO下载地址在 最后 请大家去下载 . 如果gif图片地址无效 了.      请大家自行到网上去寻找一个 gif图片地址 复制过去就可以了.谢谢大家 不会在 eclipse下使用  (android开源库android-gif-drawable)     请看我的这篇博客   (android开源库android-gif-drawable)第一篇 eclipse使用

GitHub Top 100的Android开源库

本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best Match」得到的结果,然后过滤了跟Android不相关的项目,所以排名并不具备任何官方效力,仅供参考学习,方便初学者快速了解当前一些流行的Android开源库. 1. React Native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native,

Android开源库与设计模式开源组SAOS建立

Android开源库与设计模式开源组建立 简介 在2014年年底突然参与了CSDN的博客之星评选,看着自己的博客水平实在太低,于是就想一定得写一些跟别人不太一样的博客出来.经过自己的一番思考,觉得在Android开源库的深入实现上并没有什么太多的资料,或者只是大概讲述了一些基本原理.这样我觉得是不够的,很多事情你没有自己去经历你不会有很深的认识,或者你根本不知道原来它会出现这样的问题.于是我就想我没通过学习轮子制造过程来更加深入的学习,这样不仅能够了解那些知名的开源库,也能够从实战的角度学习开源

(android开源库android-gif-drawable)第一篇 eclipse使用这个开源库

android开源库android-gif-drawable的使用 android的开源库是用来在android上显示gif图片的.我在网上查了一下,大家说这个框架写的不错,加载大的gif图片   不会内存溢出,于是我就想试试这个开源库,我下了作者的源代码和例子,但是我却跑不起来.不知道为什么,我又到网上去找使用这个开源库的例子发现有一个,我也下载了下来,发现还是跑不起来.我决定自己好好试试这个源代码,终于在我的努力下现在可以用了.废话完了 现在教大家怎么用这个库.大家不想看怎么做的 可以到后面