Android 圖片相關處理庫ImageLoader、Picasso、PhotoView、GifView

Universal-ImageLoader:java


在Android圖片處理中須要考慮的問題不少,例如OOM、圖片緩存和網絡圖片加載、多線程問題及圖片壓縮處理等複雜的問題,ImageLoader和Picasso爲咱們解決了這些問題。android

優勢:緩存

  • 支持本地圖片和網絡圖片的多線程異步加載和緩存處理;
  • 個性化的配置本身項目的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:app


  •  加載載網絡或本地圖片並自動緩存處理;
  • 鏈式調用;
  • 圖形轉換操做,如變換大小,旋轉等,提供了接口來讓用戶能夠自定義轉換操做;
  • 在Adapter中回收和取消當前的下載功能。

 除了加載網絡圖片,picasso還支持加載Resources, assets, files, content providers中的本地資源文件。異步

開源庫picasso-2.4.0.jar,使用以下:ide

 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 }
相關文章
相關標籤/搜索