5. 使用步骤
(1) 引入库的三种方式
引入 Universal-Image_Loader 库 : 使用以下每种方法都可以;
-- 1. 直接导入 JAR 包 : 下载地址 点击打开链接, 将 jar 包导入到 Android 工程中;
-- 2. Maven 依赖 :
<dependency> <groupId>com.nostra13.universalimageloader</groupId> <artifactId>universal-image-loader</artifactId> <version>1.9.5</version> </dependency>
-- 3. Gradle 依赖 :
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
(2) 添加网络存储权限
Manifest 配置 : 使用本 JAR 包需要添加 网络 和 内存 读写权限;
<manifest> <!-- Include following permission if you load images from Internet --> <uses-permission android:name="android.permission.INTERNET" /> <!-- Include following permission if you want to cache images on SD card --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest>
(3) 首次初始化 ImageLoader
初始化 : 首次使用 Universal-Image-Loader 之前需要初始化, 初始化必须在一个 Context 中进行初始化;
-- 初始化方法 : 创建一个 ImageLoaderConfiguration, 并且使用 ImageLoader.getInstance().init() 方法进行初始化;
public class MyActivity extends Activity { @Override public void onCreate() { super.onCreate(); // Create global configuration and initialize ImageLoader with this config ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this) ... .build(); ImageLoader.getInstance().init(config); ... } }
(4) 配置 ImageLoader
ImageLoader 配置简介 :
-- 配置全局性 (配置作用范围) : ImageLoader 的 配置 (ImageLoaderConfiguration) 在应用全局中有效, 你只需要设置它一次.
-- 配置可选性 : 配置中所有的选项都是可选的;
-- 默认配置 : 可以查看 ImageLoaderConfiguration.java 类, 其中的默认值即默认配置;
/** {@value} */ public static final int DEFAULT_THREAD_POOL_SIZE = 3; /** {@value} */ public static final int DEFAULT_THREAD_PRIORITY = Thread.NORM_PRIORITY - 2; /** {@value} */ public static final QueueProcessingType DEFAULT_TASK_PROCESSING_TYPE = QueueProcessingType.FIFO; private Context context; private int maxImageWidthForMemoryCache = 0; private int maxImageHeightForMemoryCache = 0; private int maxImageWidthForDiskCache = 0; private int maxImageHeightForDiskCache = 0; private BitmapProcessor processorForDiskCache = null; private Executor taskExecutor = null; private Executor taskExecutorForCachedImages = null; private boolean customExecutor = false; private boolean customExecutorForCachedImages = false; private int threadPoolSize = DEFAULT_THREAD_POOL_SIZE; private int threadPriority = DEFAULT_THREAD_PRIORITY; private boolean denyCacheImageMultipleSizesInMemory = false; private QueueProcessingType tasksProcessingType = DEFAULT_TASK_PROCESSING_TYPE; private int memoryCacheSize = 0; private long diskCacheSize = 0; private int diskCacheFileCount = 0; private MemoryCache memoryCache = null; private DiskCache diskCache = null; private FileNameGenerator diskCacheFileNameGenerator = null; private ImageDownloader downloader = null; private ImageDecoder decoder; private DisplayImageOptions defaultDisplayImageOptions = null; private boolean writeLogs = false;
-- 配置示例 : 所有配置的示例.
// DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using. // See the sample project how to use ImageLoader correctly. File cacheDir = StorageUtils.getCacheDirectory(context); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .memoryCacheExtraOptions(480, 800) // default = device screen dimensions .diskCacheExtraOptions(480, 800, null) .taskExecutor(...) .taskExecutorForCachedImages(...) .threadPoolSize(3) // default .threadPriority(Thread.NORM_PRIORITY - 2) // default .tasksProcessingOrder(QueueProcessingType.FIFO) // default .denyCacheImageMultipleSizesInMemory() .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) .memoryCacheSize(2 * 1024 * 1024) .memoryCacheSizePercentage(13) // default .diskCache(new UnlimitedDiskCache(cacheDir)) // default .diskCacheSize(50 * 1024 * 1024) .diskCacheFileCount(100) .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default .imageDownloader(new BaseImageDownloader(context)) // default .imageDecoder(new BaseImageDecoder()) // default .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default .writeDebugLogs() .build();
(5) 展示选项
展示选项简介 :
-- 作用范围 : 展示选项 (DisplayImageOptions) 只对每个展示任务 (Display Task) 有效 (ImageLoader.displayImage(...));
-- 展示任务 : 展示选项 (Display Options) 可以被应用于每个展示任务 (ImageLoader.displayImage(...) call);
-- 默认展示选项使用条件 : 如果展示选项没有通过 ImageLoader.displayImage(...) 方法设置, 那么就会使用默认的展示选项;
-- 默认展示选项来源 : 展示选项是 配置类 调用 ddefaultDisplayImageOptions() 方法获取, 如ImageLoaderConfiguration.defaultDisplayImageOptions(...) ;
-- 展示选项示例 :
// DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using. // See the sample project how to use ImageLoader correctly. DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_stub) // resource or drawable .showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable .showImageOnFail(R.drawable.ic_error) // resource or drawable .resetViewBeforeLoading(false) // default .delayBeforeLoading(1000) .cacheInMemory(false) // default .cacheOnDisk(false) // default .preProcessor(...) .postProcessor(...) .extraForDownloader(...) .considerExifParams(false) // default .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default .bitmapConfig(Bitmap.Config.ARGB_8888) // default .decodingOptions(...) .displayer(new SimpleBitmapDisplayer()) // default .handler(new Handler()) // default .build();
二. Universal-Image-Loader 示例代码
示例代码地址 : https://github.com/han1202012/Android-Quick-Develop/tree/master/app_sample_universal-image-loader
1. ListView 中使用 UIL
ListView 中使用 UIL :
-- 核心代码 : 主要是在 ListView 的适配器中使用 UIL;
-- 设置展示选项 :
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub) //设置加载时的图片
.showImageForEmptyUri(R.drawable.ic_empty) //设置没有 Uri 地址时的图片
.showImageOnFail(R.drawable.ic_error) //设置加载失败时的图片
.cacheInMemory(true) //设置内存缓存
.cacheOnDisk(true) //设置硬盘缓存
.considerExifParams(true) //考虑相机参数
.displayer(new CircleBitmapDisplayer(Color.WHITE, 5))//设置加载器, 将图片切成圆形展示出来
.build();
-- 调用核心方法展示图片 :
ImageLoader.getInstance().displayImage(IMAGE_URLS[position], holder.image, options, animateFirstListener);
-- 完整的 ListView 适配器代码 :
private static class ImageAdapter extends BaseAdapter { private static final String[] IMAGE_URLS = Constants.IMAGES_CN; private LayoutInflater inflater; private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener(); private DisplayImageOptions options; ImageAdapter(Context context) { inflater = LayoutInflater.from(context); options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_stub) //设置加载时的图片 .showImageForEmptyUri(R.drawable.ic_empty) //设置没有 Uri 地址时的图片 .showImageOnFail(R.drawable.ic_error) //设置加载失败时的图片 .cacheInMemory(true) //设置内存缓存 .cacheOnDisk(true) //设置硬盘缓存 .considerExifParams(true) //考虑相机参数 .displayer(new CircleBitmapDisplayer(Color.WHITE, 5))//设置加载器, 将图片切成圆形展示出来 .build(); } @Override public int getCount() { return IMAGE_URLS.length; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; final ViewHolder holder; if (convertView == null) { view = inflater.inflate(R.layout.item_list_image, parent, false); holder = new ViewHolder(); holder.text = (TextView) view.findViewById(R.id.text); holder.image = (ImageView) view.findViewById(R.id.image); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } holder.text.setText("Item " + (position + 1)); //加载 并 显示图片 ImageLoader.getInstance().displayImage(IMAGE_URLS[position], holder.image, options, animateFirstListener); return view; } static class ViewHolder { TextView text; ImageView image; } }
-- 效果图 :