アンウ.ImageLoader_二次サンプリング
13674 ワード
使用するウェブサイト:http://www.jianshu.com/p/1490965760c9
1.Androidプロジェクトを新規作成し、JARパッケージをダウンロードしてプロジェクトlibsディレクトリの下に追加します。新しいMyAppplicationを作成して、Appplicationを継承して、onCreate()にImageLoaderの構成パラメータを作成して、ImageLoaderのコードに初期化します。
ImageLoad Android , Git :https://github.com/nostra13/Android-Universal-Image-Loader,ImageLoad :
1. , , , assets drawable ;
2. ImageLoader, , , , , ;
3. , SD ;
4. ;
5. (ImageView) Bitmap , Bitmap ;
6. , , , ListView,GridView , , ;
7.
ImageLoadの具体的な使用方法:1.Androidプロジェクトを新規作成し、JARパッケージをダウンロードしてプロジェクトlibsディレクトリの下に追加します。新しいMyAppplicationを作成して、Appplicationを継承して、onCreate()にImageLoaderの構成パラメータを作成して、ImageLoaderのコードに初期化します。
package com.example.uil;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import android.app.Application;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// ImageLoader
ImageLoaderConfiguration configuration = ImageLoaderConfiguration
.createDefault(this);
//Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(configuration);
}
}
ImageLoader Configrationは画像キャリアImageLoaderの構成パラメータであり、建築者モードを使用しています。ここではcreateDefaultを直接使用してデフォルトのImageLoader Configrationを作成します。もちろん、ImageLoader Configrationを自分で設定することもできます。File cacheDir = StorageUtils.getCacheDirectory(context);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480, 800) // ,
.diskCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null) //
.taskExecutor(...) //
.taskExecutorForCachedImages(...) //
.threadPoolSize(3) // , 3
.threadPriority(Thread.NORM_PRIORITY - 1) //
.tasksProcessingOrder(QueueProcessingType.FIFO) //
.denyCacheImageMultipleSizesInMemory() //
.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //
.memoryCacheSize(2 * 1024 * 1024) //
.memoryCacheSizePercentage(13) //
.diskCache(new UnlimitedDiscCache(cacheDir)) //
.diskCacheSize(50 * 1024 * 1024) //
.diskCacheFileCount(100) //
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) //
.imageDownloader(new BaseImageDownloader(context)) // ,
.imageDecoder(new BaseImageDecoder()) // , InputStream Bitmap
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) //
.writeDebugLogs() // debug log
.build();
これらはすべてのオプション構成です。プロジェクトの中では自分で設定する必要はありません。一般的にクリエートDefault()で作成したImageLoader Configrationを使って使えます。そしてImageLoaderのinit()を呼び出してImageLoader Configrationパラメータを転送します。ImageLoaderはシングルモードを使います。3.Android Manifestファイルの配置
...
...
4.ロードピクチャImageLaderは、これらのdisplayImage()、loadImage()、loadImageSync()、loadImage Sync()、loadImageSync()方法は同期しています。android 4.0は特性があります。ネットワーク操作はメインスレッドにありませんので、loadImageSync()は使用しません。1.loadImage()
final ImageView mImageView = (ImageView) findViewById(R.id.image);
String imageUrl = "http://img.showcdn.cn/uploads/allimg/160307/20-16030G15J1435.jpg";
ImageLoader.getInstance().loadImage(imageUrl, 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) {
//
mImageView.setImageBitmap(loadedImage);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
//
}
});
着信画像のurlとImageLoaderListenerは、フィードバック方法one LoadingCompletter()ではloadedImageをImageViewの上に設定すればいいです。ImageLoader Listenerに入るのが複雑すぎると感じたら、SimpleImage LoadingListener類を使用してもいいです。final ImageView mImageView = (ImageView) findViewById(R.id.image);
String imageUrl = "http://img.showcdn.cn/uploads/allimg/160307/20-16030G15J1435.jpg";
ImageLoader.getInstance().loadImage(imageUrl, new SimpleImageLoadingListener(){
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
mImageView.setImageBitmap(loadedImage);
}
});
上は簡単にImageLoaderを使ってネットの画像をロードしていますが、実際の開発においては、私達はこのように使用しません。普通はどう使いますか?私たちはDisplayImageOptionsを使用します。彼はいくつかの画像表示のオプションを設定できます。例えば画像がロード中にImageViewで表示された画像はメモリキャッシュを使う必要がありますか?ファイルキャッシュを使う必要がありますか?DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub) //
.showImageForEmptyUri(R.drawable.ic_empty) //
.showImageOnFail(R.drawable.ic_error) //
.resetViewBeforeLoading(false) // view , false
.delayBeforeLoading(1000) // ,
.cacheInMemory(false) // , false
.cacheOnDisk(false) // , false
.preProcessor(...) //
.postProcessor(...) //
.extraForDownloader(...) //
.considerExifParams(false) // EXIF , false
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) //
.bitmapConfig(Bitmap.Config.ARGB_8888) //
.decodingOptions(...) // BitmapFactory.Options,
.displayer(new SimpleBitmapDisplayer()) //
.handler(new Handler()) // handler ,
.build();
Demo------------package com.example.liuentong20171024recyclerview_catcherror;
import android.app.Application;
import android.graphics.Bitmap;
import android.os.Handler;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
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 java.io.File;
/**
* :author
* :2017/10/24:8:16
* :
*/
public class MyApp extends Application {
ImageLoader imageLoader;
@Override
public void onCreate() {
super.onCreate();
File file = this.getCacheDir();
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.ic_launcher) //
.showImageForEmptyUri(R.mipmap.ic_launcher) //
.showImageOnFail(R.mipmap.ic_launcher_round) //
.resetViewBeforeLoading(false) // view , false
.delayBeforeLoading(1000) // ,
.cacheInMemory(true) // , false
.cacheOnDisk(true) // , false
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) //
.bitmapConfig(Bitmap.Config.ARGB_8888) //
.handler(new Handler()) // handler ,
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
this)
// max width, max height,
.memoryCacheExtraOptions(480, 800)
//
.threadPoolSize(3)
//
.threadPriority(Thread.NORM_PRIORITY - 2)
.defaultDisplayImageOptions(options)
// You can pass your own memory cache implementation
// .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
// .memoryCacheSize(2 * 1024 * 1024)
// 50MB
.diskCacheSize(50 * 1024 * 1024)
// URI MD5
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
//
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())// URI HASHCODE
.tasksProcessingOrder(QueueProcessingType.LIFO)
.diskCacheFileCount(100) // File
.diskCache(new UnlimitedDiscCache(file))//
// .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
// .imageDownloader(new BaseImageDownloader(context, 5 * 1000,
// 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)
.writeDebugLogs() // Remove for release app
.build();
ImageLoader.getInstance().init(config);
}
}
写真の二次サンプリング――package code.feihu.com.shangfeihu_yuekao.utils;
import android.graphics.BitmapFactory;
/**
* Created by
* Emali: [email protected]
* :
*/
public class BitmapUtils {
/**
* @param filePath
* @param destWidth
* @param destHeight
* @return
*/
public static android.graphics.Bitmap getBitmap(String filePath, int destWidth, int destHeight) {
//
BitmapFactory.Options options = new BitmapFactory.Options();
// true ,
options.inJustDecodeBounds = true;
// , ,
BitmapFactory.decodeFile(filePath, options);
//
int outWidth = options.outWidth;
int outHeight = options.outHeight;
//
int sampleSize = 1;
while (outHeight / sampleSize > destHeight || outWidth / sampleSize > destWidth) {
// ,
//sampleSize 2 n , sampleSize 2 n ,
sampleSize *= 2;
}
/********************************************************************************************/
// , , sampleSize
/********************************************************************************************/
//
// , , inJustDecodeBounds false
options.inJustDecodeBounds = false;
//
options.inSampleSize = sampleSize;
//
return BitmapFactory.decodeFile(filePath, options);
}
public static android.graphics.Bitmap getBitmap(byte[] filePath, int destWidth, int destHeight) {
//
BitmapFactory.Options options = new BitmapFactory.Options();
// true ,
options.inJustDecodeBounds = true;
// , ,
BitmapFactory.decodeByteArray(filePath, 0, filePath.length, options);
//
int outWidth = options.outWidth;
int outHeight = options.outHeight;
//
int sampleSize = 1;
while (outHeight / sampleSize > destHeight || outWidth / sampleSize > destWidth) {
// ,
//sampleSize 2 n , sampleSize 2 n ,
sampleSize *= 2;
}
/********************************************************************************************/
// , , sampleSize
/********************************************************************************************/
//
// , , inJustDecodeBounds false
options.inJustDecodeBounds = false;
//
options.inSampleSize = sampleSize;
//
return BitmapFactory.decodeByteArray(filePath, 0, filePath.length, options);
}
}
デモ---OkHttpUtils.getInstance().doGet(irb.getStories().get(position).getImages().get(0), new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final Bitmap bitmap = BitmapUtils.getBitmap(response.body().bytes(), 100, 200);
handler.post(new Runnable() {
@Override
public void run() {
holder.iv.setImageBitmap(bitmap);
}
});
}
});