一,先要配置ImageLoaderConfiguration这个类实现全局ImageLoader的实现情况
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( this) .memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长宽 .discCacheExtraOptions(480, 800, null) //Can slow ImageLoader, use it carefully (Better don't use // it)/设置缓存的详细信息,最好不要设置这个 .threadPoolSize(3)// 线程池内加载的数量 .threadPriority(Thread.NORM_PRIORITY - 2) .denyCacheImageMultipleSizesInMemory() .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache // implementation/你可以通过自己的内存缓存实现 .memoryCacheSize(2 * 1024 * 1024)//内存大小 .discCacheSize(50 * 1024 * 1024)//硬盘大小 .discCacheFileNameGenerator(new Md5FileNameGenerator()) // 将保存的时候的URI名称用MD5 加密 .tasksProcessingOrder(QueueProcessingType.LIFO) .discCacheFileCount(100) // 缓存的文件数量 .discCache(new UnlimitedDiscCache(new File(Environment.getExternalStorageDirectory()+ "/myApp/imgCache"))) // 自定义缓存路径 .defaultDisplayImageOptions(getDisplayOptions()) .imageDownloader(new BaseImageDownloader(this, 5 * 1000, 30 * 1000)) .writeDebugLogs() // Remove for release app .build();// 开始构建 ImageLoader.getInstance().init(config);//全局初始化此配置<span style="margin: 0px; padding: 0px; border: currentcolor; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px; background-color: inherit;"> </span>
protected ImageLoader imageLoader = ImageLoader.getInstance();之后进行显示的图片的各种格式DisplayImageOptions 的设置
DisplayImageOptions options; options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_launcher)// 设置图片在下载期间显示的图片 .showImageForEmptyUri(R.drawable.ic_launcher)// 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.ic_launcher) // 设置图片加载/解码过程中错误时候显示的图片 .cacheInMemory(true)// 设置下载的图片是否缓存在内存中 .cacheOnDisc(true)// 设置下载的图片是否缓存在SD卡中 .considerExifParams(true) // 是否考虑JPEG图像EXIF参数(旋转,翻转) .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)// 设置图片以如何的编码方式显示 .bitmapConfig(Bitmap.Config.RGB_565)// 设置图片的解码类型// // .delayBeforeLoading(int delayInMillis)//int // delayInMillis为你设置的下载前的延迟时间 // 设置图片加入缓存前,对bitmap进行设置 // .preProcessor(BitmapProcessor preProcessor) .resetViewBeforeLoading(true)// 设置图片在下载前是否重置,复位 .displayer(new RoundedBitmapDisplayer(20))// 是否设置为圆角,弧度为多少 .displayer(new FadeInBitmapDisplayer(100))// 是否图片加载好后渐入的动画时间 .build();// 构建完成
按照你所需要的配置去设置,如果不需要的就可以不做配置。
ImageLoaderConfiguration是针对图片缓存的全局配置,主要有线程类、缓存大小、磁盘大小、图片下载与解析、日志方面的配置。
ImageLoader是具体下载图片,缓存图片,显示图片的具体执行类,它有两个具体的方法displayImage(...)、loadImage(...),但是其实最终他们的实现都是displayImage(...)。
DisplayImageOptions用于指导1,每一个Imageloader根据网络图片的状态(空白、下载错误、正在下载)显示对应的图片,2,是否将缓存加载到磁盘上,下载完后对图片进行怎么样的处理。
从三者的协作关系上看,他们有点像厨房规定、厨师、客户个人口味之间的关系。ImageLoaderConfiguration就像是厨房里面的规定,每一个厨师要怎么着装,要怎么保持厨房的干净,这是针对每一个厨师都适用的规定,而且不允许个性化改变。ImageLoader就像是具体做菜的厨师,负责具体菜谱的制作。DisplayImageOptions就像每个客户的偏好,根据客户是重口味还是清淡,每一个imageLoader根据DisplayImageOptions的要求具体执行。
1.纯粹为了加载默认配置的一个图片的
ImageLoader.getInstance().displayImage(imageUrl, imageView); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件
import java.io.File; import android.app.Application; import android.graphics.Bitmap; import android.os.Environment; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.assist.QueueProcessingType; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import com.nostra13.universalimageloader.core.download.BaseImageDownloader; public class MyApplication extends Application { @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( this) .memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长宽 .discCacheExtraOptions(480, 800, null) //Can slow ImageLoader, use it carefully (Better don't use // it)/设置缓存的详细信息,最好不要设置这个 .threadPoolSize(3)// 线程池内加载的数量 .threadPriority(Thread.NORM_PRIORITY - 2) .denyCacheImageMultipleSizesInMemory() .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache // implementation/你可以通过自己的内存缓存实现 .memoryCacheSize(2 * 1024 * 1024)//内存大小 .discCacheSize(50 * 1024 * 1024)//硬盘大小 .discCacheFileNameGenerator(new Md5FileNameGenerator()) // 将保存的时候的URI名称用MD5 加密 .tasksProcessingOrder(QueueProcessingType.LIFO) .discCacheFileCount(100) // 缓存的文件数量 .discCache(new UnlimitedDiscCache(new File(Environment.getExternalStorageDirectory()+ "/myApp/imgCache"))) // 自定义缓存路径 .defaultDisplayImageOptions(getDisplayOptions()) .imageDownloader(new BaseImageDownloader(this, 5 * 1000, 30 * 1000)) .writeDebugLogs() // Remove for release app .build();// 开始构建 //全局初始化此配置 ImageLoader.getInstance().init(config); } private DisplayImageOptions getDisplayOptions() { DisplayImageOptions options; options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_launcher)// 设置图片在下载期间显示的图片 .showImageForEmptyUri(R.drawable.ic_launcher)// 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.ic_launcher) // 设置图片加载/解码过程中错误时候显示的图片 .cacheInMemory(true)// 设置下载的图片是否缓存在内存中 .cacheOnDisc(true)// 设置下载的图片是否缓存在SD卡中 .considerExifParams(true) // 是否考虑JPEG图像EXIF参数(旋转,翻转) .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)// 设置图片以如何的编码方式显示 .bitmapConfig(Bitmap.Config.RGB_565)// 设置图片的解码类型// // .delayBeforeLoading(int delayInMillis)//int // delayInMillis为你设置的下载前的延迟时间 // 设置图片加入缓存前,对bitmap进行设置 // .preProcessor(BitmapProcessor preProcessor) .resetViewBeforeLoading(true)// 设置图片在下载前是否重置,复位 .displayer(new RoundedBitmapDisplayer(20))// 是否设置为圆角,弧度为多少 .displayer(new FadeInBitmapDisplayer(100))// 是否图片加载好后渐入的动画时间 .build();// 构建完成 return options; } }
public class MainActivity extends Activity { private ImageLoader loader; private ImageView iv_img; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loader = ImageLoader.getInstance(); iv_img = (ImageView) this.findViewById(R.id.iv_img); String uri = "file:///" + "本地路径"; // loader.displayImage( // "http://s1.jikexueyuan.com/current/static/images/logo.png", // iv_img); loader.displayImage( "http://s1.jikexueyuan.com/current/static/images/logo.png", iv_img, new ImageLoadingListener() { @Override public void onLoadingStarted(String arg0, View arg1) { Log.i("info", "onLoadingStarted"); } @Override public void onLoadingFailed(String arg0, View arg1, FailReason arg2) { Log.i("info", "onLoadingFailed"); } @Override public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) { Log.i("info", "onLoadingComplete"); } @Override public void onLoadingCancelled(String arg0, View arg1) { Log.i("info", "onLoadingCancelled"); } }); }
ImageLoader.getInstance().displayImage(imageUrl, imageView,options); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件 , options代表DisplayImageOptions配置文件
options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_stub) // 设置图片下载期间显示的图片 .showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.ic_error) // 设置图片加载或解码过程中发生错误显示的图片 .cacheInMemory(true) // 设置下载的图片是否缓存在内存中 .cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中 .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片 .build();
imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() { @Override public void onLoadingStarted() { //开始加载的时候执行 } @Override public void onLoadingFailed(FailReason failReason) { //加载失败的时候执行 } @Override public void onLoadingComplete(Bitmap loadedImage) { //加载成功的时候执行 } @Override public void onLoadingCancelled() { //加载取消的时候执行 }});
BaseActivity.java
package com.xwj.imageloaderdemo; import com.nostra13.universalimageloader.core.ImageLoader; import android.app.Activity; import android.os.Bundle; public abstract class BaseActivity extends Activity { protected ImageLoader imageLoader; /** * 初始化布局资源文件 */ public abstract int initResource(); /** * 初始化组件 */ public abstract void initComponent(); /** * 初始化数据 */ public abstract void initData(); /** * 添加监听 */ public abstract void addListener(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(initResource()); imageLoader = ImageLoader.getInstance(); initComponent(); initData(); addListener(); } }ImageGridActivity.java
package com.xwj.imageloaderdemo; import android.R.integer; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import com.xwj.util.Constants; public class ImageGridActivity extends BaseActivity{ private GridView mGridGv; private DisplayImageOptions options; // 设置图片显示相关参数 private String[] imageUrls; // 图片路径 @Override public int initResource() { return R.layout.activity_gridview; } @Override public void initComponent() { mGridGv = (GridView) findViewById(R.id.gv_image); } @Override public void initData() { Bundle bundle = getIntent().getExtras(); imageUrls = bundle.getStringArray(Constants.IMAGES); options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_stub) // 设置图片下载期间显示的图片 .showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.ic_error) // 设置图片加载或解码过程中发生错误显示的图片 .cacheInMemory(true) // 设置下载的图片是否缓存在内存中 .cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中 .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片 .build(); mGridGv.setAdapter(new ItemGridAdapter()); } @Override public void addListener() { mGridGv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { } }); } class ItemGridAdapter extends BaseAdapter{ @Override public int getCount() { return imageUrls.length; } @Override public Object getItem(int position) { return imageUrls[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { viewHolder = new ViewHolder(); convertView = getLayoutInflater().inflate(R.layout.item_grid, parent, false); viewHolder.image = (ImageView) convertView.findViewById(R.id.iv_grid_image); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } imageLoader.displayImage(imageUrls[position], viewHolder.image, options); return convertView; } public class ViewHolder { public ImageView image; } } }
package com.xwj.imageloaderdemo; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import com.xwj.util.Constants; public class ImageListActivity extends BaseActivity { private ListView mListImageLv; private DisplayImageOptions options; // 设置图片显示相关参数 private String[] imageUrls; // 图片路径 @Override public int initResource() { return R.layout.activity_list; } @Override public void initComponent() { mListImageLv = (ListView) findViewById(R.id.lv_image); } @Override public void initData() { Bundle bundle = getIntent().getExtras(); imageUrls = bundle.getStringArray(Constants.IMAGES); // 使用DisplayImageOptions.Builder()创建DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_stub) // 设置图片下载期间显示的图片 .showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.ic_error) // 设置图片加载或解码过程中发生错误显示的图片 .cacheInMemory(true) // 设置下载的图片是否缓存在内存中 .cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中 .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片 .build(); // 构建完成 mListImageLv.setAdapter(new ItemListAdapter()); } @Override public void addListener() { } class ItemListAdapter extends BaseAdapter { @Override public int getCount() { return imageUrls.length; } @Override public Object getItem(int position) { return imageUrls[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { convertView = getLayoutInflater().inflate(R.layout.item_list, null); viewHolder = new ViewHolder(); viewHolder.image = (ImageView) convertView .findViewById(R.id.iv_image); viewHolder.text = (TextView) convertView .findViewById(R.id.tv_introduce); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } /** * imageUrl 图片的Url地址 imageView 承载图片的ImageView控件 options * DisplayImageOptions配置文件 */ imageLoader.displayImage(imageUrls[position], viewHolder.image, options); viewHolder.text.setText("Item " + (position + 1)); // TextView设置文本 return convertView; } public class ViewHolder { public ImageView image; public TextView text; } } }ImageLoaderApplication.java
package com.xwj.imageloaderdemo; import java.io.File; import android.app.Application; import android.content.Context; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.assist.QueueProcessingType; import com.nostra13.universalimageloader.core.download.BaseImageDownloader; import com.nostra13.universalimageloader.utils.StorageUtils; public class ImageLoaderApplication extends Application { public void onCreate() { super.onCreate(); initImageLoader(getApplicationContext()); } public static void initImageLoader(Context context) { //缓存文件的目录 File cacheDir = StorageUtils.getOwnCacheDirectory(context, "imageloader/Cache"); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长宽 .threadPoolSize(3) //线程池内加载的数量 .threadPriority(Thread.NORM_PRIORITY - 2) .denyCacheImageMultipleSizesInMemory() .diskCacheFileNameGenerator(new Md5FileNameGenerator()) //将保存的时候的URI名称用MD5 加密 .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache implementation/你可以通过自己的内存缓存实现 .memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值 .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值 .tasksProcessingOrder(QueueProcessingType.LIFO) // 由原先的discCache -> diskCache .diskCache(new UnlimitedDiscCache(cacheDir))//自定义缓存路径 .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间 .writeDebugLogs() // Remove for release app .build(); //全局初始化此配置 ImageLoader.getInstance().init(config); } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xwj.imageloaderdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:name="com.xwj.imageloaderdemo.ImageLoaderApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.xwj.imageloaderdemo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.xwj.imageloaderdemo.ImageListActivity"></activity> <activity android:name="com.xwj.imageloaderdemo.ImageGridActivity"></activity> </application> </manifest>本地图片Uri:
String imageUri = "http://site.com/image.png"; // from Web String imageUri = "file:///mnt/sdcard/image.png"; // from SD card String imageUri = "content://media/external/audio/albumart/13"; // from content provider String imageUri = "assets://image.png"; // from assets String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)参考:
http://www.cnblogs.com/kissazi2/p/3886563.html
http://blog.csdn.net/vipzjyno1/article/details/23206387