Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 【Android應用開發】 Universal Image Loader ( 使用簡介 | 示例代碼解析 )

【Android應用開發】 Universal Image Loader ( 使用簡介 | 示例代碼解析 )

編輯:關於Android編程

相關地址介紹 :

--Universal Image Loader 項目 GitHub 官方地址:Android-Universal-Image-Loader" target="_blank">https://github.com/nostra13/Android-Universal-Image-Loader.

-- Universal Image Loader 項目完整中文注釋版, 已經將所有類都進行了中文注釋, 適合源碼學習參考:https://github.com/han1202012/Android-Quick-Develop/tree/master/lib_universal-image-loader;

一. Universal-Image-Loader 簡介

1. 基本功能

-- 1. 多線程圖片加載 (同步|異步)

-- 2. 廣泛的 ImageLoader 定制, 線程執行者, 下載, 編碼, 內存 和 硬盤 緩存, 圖片顯示 等配置;

-- 3. 圖片展示的可選定制, 圖片存儲, 緩存切換, 編解碼操作, Bitmap 處理和展示;

-- 4. 圖片的內存緩存 和 硬盤緩存, 硬盤包括設備的文件系統 或 SD 卡;

-- 5. 監聽加載過程, 包括下載過程;

 

2. 可使用的 URI 地址種類

識別的 URI 地址 :

-- 網絡資源 : "http://site.com/image.png" // from Web

-- 本地 SD 卡資源 : "file:///mnt/sdcard/image.png" // from SD card

-- 本地 SD 卡資源 (媒體資源) : "file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)

-- ContentProvider 圖片資源 : "content://media/external/images/media/13" // from content provider

-- ContentProvider 媒體資源 :"content://media/external/video/media/13" // from content provider (video thumbnail)

-- 工程中的 assets 目錄 : "assets://image.png" // from assets

-- 工程中的 res 目錄 : "drawable://" + R.drawable.img // from drawables (non-9patch images)

3. ImageLoader 簡單使用

ImageLoader 簡單使用 :

-- 1. 獲取 ImageLoader : 獲取 ImageLoader 單例實例對象;

ImageLoader imageLoader = ImageLoader.getInstance();

-- 2. 加載圖片到 ImageView : 加載圖片, 將圖片解析成 Bitmap 對象, 並將 Bitmap 設置到 ImageView 中顯示, 或者 其它實現了 ImageAware 接口的 View 對象;

imageLoader.displayImage(imageUri, imageView);

-- 3. 異步加載圖片 : 加載圖片, 將圖片解析成 Bitmap 對象, 並在解析完成時返回, 解析返回不是實時同步的;

imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        // 執行你想要對 Bitmap 對象進行的操作
    }
});

-- 4. 同步加載圖片 : 加載圖片文件, 將圖片文件解析成 Bitmap 對象, 並實時同步返回 Bitmap 對象;

Bitmap bmp = imageLoader.loadImageSync(imageUri);

4. ImageLoader 完整使用

ImageLoader 完整使用:

--1. 加載圖片到 ImageView: 加載圖片, 將圖片解析成 Bitmap 對象, 並將 Bitmap 設置到 ImageView 中顯示, 或者 其它實現了 ImageAware 接口的 View 對象;

// Load image, decode it to Bitmap and display Bitmap in ImageView (or any other view 

//  which implements ImageAware interface)
imageLoader.displayImage(imageUri, imageView, options, new ImageLoadingListener() {
    @Override
    public void onLoadingStarted(String imageUri, View view) {
        ...
    }
    @Override
    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
        ...
    }
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        ...
    }
    @Override
    public void onLoadingCancelled(String imageUri, View view) {
        ...
    }
}, new ImageLoadingProgressListener() {
    @Override
    public void onProgressUpdate(String imageUri, View view, int current, int total) {
        ...
    }
});

-- 2. 異步加載圖片 :加載圖片, 將圖片解析成 Bitmap 對象, 並在解析完成時返回, 解析返回不是實時同步的;

 

// Load image, decode it to Bitmap and return Bitmap to callback
ImageSize targetSize = new ImageSize(80, 50); // result Bitmap will be fit to this size
imageLoader.loadImage(imageUri, targetSize, options, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        // Do whatever you want with Bitmap
    }
});

-- 3. 同步加載圖片 :加載圖片文件, 將圖片文件解析成 Bitmap 對象, 並實時同步返回 Bitmap 對象;

// Load image, decode it to Bitmap and return Bitmap synchronously

ImageSize targetSize = new ImageSize(80, 50); // result Bitmap will be fit to this size
Bitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options);

 

5. 使用步驟

(1) 引入庫的三種方式

引入 Universal-Image_Loader 庫 : 使用以下每種方法都可以;

-- 1. 直接導入 JAR 包 : 下載地址點擊打開鏈接, 將 jar 包導入到 Android 工程中;

-- 2. Maven 依賴 :


    com.nostra13.universalimageloader
    universal-image-loader
    1.9.5

-- 3. Gradle 依賴 :
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

 

(2) 添加網絡存儲權限

Manifest 配置 : 使用本 JAR 包需要添加 網絡 和 內存 讀寫權限;

 


    
    
    
    
    ...

 

 

 

(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;
		}
	}

-- 效果圖 :

 

2. GridView中使用 UIL

GridView 中使用 UIL:

--核心代碼: 主要是在 GridView 中的適配器中使用 UIL;

--設置展示選項:

 

		private DisplayImageOptions options;

		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)					//考慮相機參數
					.bitmapConfig(Bitmap.Config.RGB_565)		//設置解碼參數
					.build();


 

-- 設置加載 處理 監聽器 : 在加載圖片時 可以設置加載監聽器;

 

			//加載 並 顯示圖片, 設置加載監聽器 監聽 開始加載 加載失敗 加載完成 事件
			ImageLoader.getInstance()
					.displayImage(IMAGE_URLS[position], holder.imageView, options, new SimpleImageLoadingListener() {
						@Override
						public void onLoadingStarted(String imageUri, View view) {
							holder.progressBar.setProgress(0);
							holder.progressBar.setVisibility(View.VISIBLE);
						}

						@Override
						public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
							holder.progressBar.setVisibility(View.GONE);
						}

						@Override
						public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
							holder.progressBar.setVisibility(View.GONE);
						}
					}, new ImageLoadingProgressListener() {
						@Override
						public void onProgressUpdate(String imageUri, View view, int current, int total) {
							holder.progressBar.setProgress(Math.round(100.0f * current / total));
						}
					});

-- 完整的 GridView 適配器代碼 :

	private static class ImageAdapter extends BaseAdapter {

		private static final String[] IMAGE_URLS = Constants.IMAGES_CN;

		private LayoutInflater inflater;

		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)					//考慮相機參數
					.bitmapConfig(Bitmap.Config.RGB_565)		//設置解碼參數
					.build();
		}

		@Override
		public int getCount() {
			return IMAGE_URLS.length;
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			final ViewHolder holder;
			View view = convertView;
			if (view == null) {
				view = inflater.inflate(R.layout.item_grid_image, parent, false);
				holder = new ViewHolder();
				assert view != null;
				holder.imageView = (ImageView) view.findViewById(R.id.image);
				holder.progressBar = (ProgressBar) view.findViewById(R.id.progress);
				view.setTag(holder);
			} else {
				holder = (ViewHolder) view.getTag();
			}

			//加載 並 顯示圖片, 設置加載監聽器 監聽 開始加載 加載失敗 加載完成 事件
			ImageLoader.getInstance()
					.displayImage(IMAGE_URLS[position], holder.imageView, options, new SimpleImageLoadingListener() {
						@Override
						public void onLoadingStarted(String imageUri, View view) {
							holder.progressBar.setProgress(0);
							holder.progressBar.setVisibility(View.VISIBLE);
						}

						@Override
						public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
							holder.progressBar.setVisibility(View.GONE);
						}

						@Override
						public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
							holder.progressBar.setVisibility(View.GONE);
						}
					}, new ImageLoadingProgressListener() {
						@Override
						public void onProgressUpdate(String imageUri, View view, int current, int total) {
							holder.progressBar.setProgress(Math.round(100.0f * current / total));
						}
					});

			return view;
		}

		static class ViewHolder {
			ImageView imageView;
			ProgressBar progressBar;
		}
	}

 

-- 顯示效果 :

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved