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 }