Universal-ImageLoader:java
在Android圖片處理中須要考慮的問題不少,例如OOM、圖片緩存和網絡圖片加載、多線程問題及圖片壓縮處理等複雜的問題,ImageLoader和Picasso爲咱們解決了這些問題。android
優勢:緩存
缺點:網絡
開源庫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
除了加載網絡圖片,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 }