Android 图片相关处理库ImageLoader、Picasso、PhotoView、GifView

Universal-ImageLoader:


在Android图片处理中需要考虑的问题很多,例如OOM、图片缓存和网络图片加载、多线程问题及图片压缩处理等复杂的问题,ImageLoader和Picasso为我们解决了这些问题。

优点:

  • 支持本地图片和网络图片的多线程异步加载和缓存处理;
  • 个性化的配置自己项目的ImageLoader;
  • 图片加载过程的监听回调;
  • 自动对加载的图片针对当前剩余内存进行裁剪优化,防止OOM;
  • 较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片;

缺点:

  • 没有对本地文件压缩处理的相关API方法以及默认都是Src模式设置图片,没有针对Background属性开放API。

开源库universal-image-loader-1.9.3.jar,简单使用代码如下: 

 1 package com.zhang.imageloaderdemo;
 2 
 3 import android.app.Application;
 4 import android.graphics.Bitmap;
 5 import android.os.Environment;
 6 
 7 import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
 8 import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
 9 import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
10 import com.nostra13.universalimageloader.core.DisplayImageOptions;
11 import com.nostra13.universalimageloader.core.ImageLoader;
12 import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
13 import com.nostra13.universalimageloader.core.assist.ImageScaleType;
14 import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
15 import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
16 import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
17 import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
18 import com.nostra13.universalimageloader.core.download.ImageDownloader;
19 
20 import java.io.File;
21 import java.io.IOException;
22 import java.io.InputStream;
23 
24 /**
25  * Created by Mr.Z on 2016/9/25 0025.
26  */
27 public class MyApplication extends Application {
28 
29     @Override
30     public void onCreate() {
31         super.onCreate();
32 
33         ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
34                 .memoryCacheExtraOptions(480, 800)//max width, max height,即保存的每个缓存文件的最大长宽
35                 .discCacheExtraOptions(480, 800, null)//设置缓存的详细信息,最好不要设置这个
36                 .threadPoolSize(3)//线程池内加载的数量
37                 .threadPriority(Thread.NORM_PRIORITY - 2)
38                 .denyCacheImageMultipleSizesInMemory()
39                 .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))//你可以通过自己的内存缓存实现
40                 .memoryCacheSize(2 * 1024 * 1024)
41                 .diskCacheSize(50 * 1024 * 1024)
42                 .discCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5 加密
43                 .tasksProcessingOrder(QueueProcessingType.FIFO)
44                 .discCacheFileCount(100)//缓存的文件数量
45                 .discCache(new UnlimitedDiscCache(new File(Environment.getExternalStorageDirectory() + "/imageLoader/imgCache")))//自定义缓存路径
46                 .defaultDisplayImageOptions(getDisplayOptions())
47                 .imageDownloader(new BaseImageDownloader(this, 5 * 1000, 30 * 1000))
48                 .writeDebugLogs()
49                 .build();//开始构建
50 
51         ImageLoader.getInstance().init(configuration);
52 
53     }
54 
55     private DisplayImageOptions getDisplayOptions() {
56 
57         DisplayImageOptions options;
58         options = new DisplayImageOptions.Builder()
59                 .showImageOnLoading(R.mipmap.ic_launcher)//设置图片在下载期间显示的图片
60                 .showImageForEmptyUri(R.mipmap.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片
61                 .showImageOnFail(R.mipmap.ic_launcher)//设置图片加载/解码过程中错误时候显示的图片
62                 .cacheInMemory(true)//设置下载的图片是否缓存在内存中
63                 .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中
64                 .considerExifParams(true)//是否考虑JPEG图像EXIF参数(旋转,翻转)
65                 .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示
66                 .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型
67 //                .delayBeforeLoading(int delayInMillis)//设置的下载前的延迟时间
68 //                .preProcessor(BitmapProcessor preProcessor)//设置图片加入缓存前,对bitmap进行设置
69                 .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
70                 .displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少
71                 .displayer(new FadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间
72                 .build();
73 
74         return options;
75     }
76 
77 
78 }
 1 package com.zhang.imageloaderdemo;
 2 
 3 import android.graphics.Bitmap;
 4 import android.support.v7.app.AppCompatActivity;
 5 import android.os.Bundle;
 6 import android.util.Log;
 7 import android.view.View;
 8 import android.widget.ImageView;
 9 
10 import com.nostra13.universalimageloader.core.ImageLoader;
11 import com.nostra13.universalimageloader.core.assist.FailReason;
12 import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
13 
14 
15 /**
16  * 1.Universal-ImageLoader配置
17  *
18  * 2.用Universal-ImageLoader加载网络图片和本地图片
19  */
20 public class MainActivity extends AppCompatActivity {
21 
22     private ImageLoader loader;
23     private ImageView imgView;
24 
25     @Override
26     protected void onCreate(Bundle savedInstanceState) {
27         super.onCreate(savedInstanceState);
28         setContentView(R.layout.activity_main);
29 
30         loader = ImageLoader.getInstance();
31         imgView = (ImageView) findViewById(R.id.img);
32         //调用本地
33         //String uri = "file:///" + "本地路径";
34         //网络
35 //        loader.displayImage("http://img0.imgtn.bdimg.com/it/u=4019581940,3959990876&fm=21&gp=0.jpg",imgView);
36 
37         //监听
38         loader.displayImage("http://img0.imgtn.bdimg.com/it/u=4019581940,3959990876&fm=21&gp=0.jpg", imgView,
39                 new ImageLoadingListener() {
40                     @Override
41                     public void onLoadingStarted(String s, View view) {
42                         Log.i("info", "onLoadingStarted");
43                     }
44 
45                     @Override
46                     public void onLoadingFailed(String s, View view, FailReason failReason) {
47                         Log.i("info", "onLoadingFailed");
48                     }
49 
50                     @Override
51                     public void onLoadingComplete(String s, View view, Bitmap bitmap) {
52                         Log.i("info", "onLoadingComplete");
53                     }
54 
55                     @Override
56                     public void onLoadingCancelled(String s, View view) {
57                         Log.i("info", "onLoadingCancelled");
58                     }
59                 });
60     }
61 }

 

Picasso:


  •  加载载网络或本地图片并自动缓存处理;
  • 链式调用;
  • 图形转换操作,如变换大小,旋转等,提供了接口来让用户可以自定义转换操作;
  • 在Adapter中回收和取消当前的下载功能。

 除了加载网络图片,picasso还支持加载Resources, assets, files, content providers中的本地资源文件。

开源库picasso-2.4.0.jar,使用如下:

 1 package com.zhang.picassodemo;
 2 
 3 import android.support.v7.app.AppCompatActivity;
 4 import android.os.Bundle;
 5 import android.widget.ImageView;
 6 
 7 import com.squareup.picasso.Picasso;
 8 
 9 public class MainActivity extends AppCompatActivity {
10 
11     @Override
12     protected void onCreate(Bundle savedInstanceState) {
13         super.onCreate(savedInstanceState);
14         setContentView(R.layout.activity_main);
15 
16         ImageView imgView = (ImageView) findViewById(R.id.img);
17 
18         Picasso.with(this).load("http://img0.imgtn.bdimg.com/it/u=4019581940,3959990876&fm=21&gp=0.jpg")
19                 .into(imgView);
20 //        //图片缩放
21 //        Picasso.with(this).load("http://img0.imgtn.bdimg.com/it/u=4019581940,3959990876&fm=21&gp=0.jpg")
22 //                .resize(50, 50)
23 //                .into(imgView);
24 //        //设置出错显示图标
25 //        Picasso.with(this).load("http://img0.imgtn.bdimg.com/it/u=4019581940,3959990876&fm=21&gp=0.jpg")
26 //                .error(R.mipmap.ic_launcher)
27 //                .into(imgView);
28 
29     }
30 }

  

PhotoView:


图片查看库,实现图片浏览功能,支持pinch(捏合)手势或者点击放大缩小。支持在ViewPager中翻页浏览图片。PhotoView 是一款扩展自Android ImageView ,支持通过单点/多点触摸来进行图片缩放的智能控件。导入photoview-library-1.2.2.jar包,在布局XML里设置PhotoView控件。使用时将PhotoView转入PhotoViewAttacher。示例:

 1 package com.zhang.photoviewdemo;
 2 
 3 import android.graphics.Bitmap;
 4 import android.graphics.BitmapFactory;
 5 import android.os.Bundle;
 6 import android.support.v7.app.AppCompatActivity;
 7 import android.view.View;
 8 
 9 import com.nostra13.universalimageloader.core.ImageLoader;
10 
11 import java.io.IOException;
12 import java.io.InputStream;
13 
14 import uk.co.senab.photoview.PhotoView;
15 import uk.co.senab.photoview.PhotoViewAttacher;
16 
17 import static com.zhang.photoviewdemo.R.id.iv_photo;
18 
19 public class MainActivity extends AppCompatActivity {
20 
21     private PhotoView ivPhoto;
22     private PhotoViewAttacher attacher;
23     private ImageLoader loader;
24 
25     @Override
26     protected void onCreate(Bundle savedInstanceState) {
27         super.onCreate(savedInstanceState);
28         setContentView(R.layout.activity_main);
29 
30         ivPhoto = (PhotoView) findViewById(iv_photo);
31         attacher = new PhotoViewAttacher(ivPhoto);
32 
33         //加载本地图片
34         try {
35             InputStream inputStream = getAssets().open("image.jpg");
36             Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
37             ivPhoto.setImageBitmap(bitmap);
38         } catch (IOException e) {
39             e.printStackTrace();
40         }
41 
42         //加载网络图片
43         loader = ImageLoader.getInstance();
44         loader.displayImage("https://www.baidu.com/img/bdlogo.png", ivPhoto);
45         ivPhoto.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {
46             @Override
47             public void onPhotoTap(View view, float v, float v1) {
48 
49             }
50         });
51     }
52 }

由于使用了ImageLoader,所以需要早Application配置一下:

 1 package com.zhang.photoviewdemo;
 2 
 3 import android.app.Application;
 4 import android.content.Context;
 5 
 6 import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
 7 import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
 8 import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
 9 import com.nostra13.universalimageloader.core.DisplayImageOptions;
10 import com.nostra13.universalimageloader.core.ImageLoader;
11 import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
12 import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
13 import com.nostra13.universalimageloader.utils.StorageUtils;
14 
15 import java.io.File;
16 
17 /**
18  * Created by Mr.Z on 2016/10/8 0008.
19  */
20 
21 public class MyApp extends Application {
22 
23     @Override
24     public void onCreate() {
25         super.onCreate();
26         initImageLoader(getApplicationContext());
27     }
28 
29     private void initImageLoader(Context context) {
30         File cacheDir = StorageUtils.getOwnCacheDirectory(context, "photoview/Cache");//获取到缓存的目录地址
31 
32         //创建配置ImageLoader(所有的选项都是可选的,只使用那些你真的想定制),这个可以设定在APPLACATION里面,设置为全局的配置参数
33         ImageLoaderConfiguration con = new ImageLoaderConfiguration.Builder(context)
34                 .threadPoolSize(3).threadPriority(Thread.NORM_PRIORITY - 2)
35                 .memoryCache(new WeakMemoryCache())
36                 .denyCacheImageMultipleSizesInMemory()
37                 .discCacheFileNameGenerator(new Md5FileNameGenerator())
38                 .tasksProcessingOrder(QueueProcessingType.LIFO)
39                 .discCache(new UnlimitedDiscCache(cacheDir))
40 //                .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
41                 .writeDebugLogs()
42                 .build();
43         ImageLoader.getInstance().init(con);
44     }
45 }

 

GifView:


GifView 是一个为了解决android中现在没有直接显示gif的view,只能通过mediaplay来显示这个问题的项目,其用法和 ImageView一样,支持gif图片。可监视GIF是否加载成功。导入GifView.jar即可使用。

 1 package com.zhang.gifview;
 2 
 3 import android.support.v7.app.AppCompatActivity;
 4 import android.os.Bundle;
 5 
 6 import com.ant.liao.GifView;
 7 
 8 public class MainActivity extends AppCompatActivity {
 9 
10     private GifView gifView;
11 
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16 
17         gifView = (GifView) findViewById(R.id.gif_view);
18         //设置图片源
19         gifView.setGifImage(R.drawable.g);
20         gifView.setShowDimension(600,600);
21 //        gifView.setGifImageType(GifView.GifImageType.COVER);
22     }
23 }

 

posted @ 2016-12-21 23:09  changchou  阅读(1563)  评论(0编辑  收藏  举报