つのライト級のピクチャーを共有して種類のImageLoaderをロードします。
7969 ワード
ImageLoaderのような写真はネット上で大きなプッシュをロードしています。有名なのはnostra 13のImage-Leoaderの画像ローディング、xUtilの写真ローディング、そしてFacebookのFreescoです。たくさんありますが、勉強の態度に基づいて、最近プロジェクトをする時、この需要をロードする写真があります。
中はLruCacheに関連して、ExectorService、大図のBitmap Factory原理を処理して、view.setTag()です。
はい、多く言わないで、まず一歩ずつ来ます。
まずパッケージの種類を見てみます。どうやって使いますか?
次に、ImageLoaderというクラスを具体的に分析します。
携帯電話のメモリが限られていることを知っています。すべての画像をメモリに入れることはできません。だから、androidはLru Cacheの方法を提供しています。使用するアルゴリズムは最近少なくともアルゴリズムを使います。また、画像にキャッシュを入れ続けています。少なくとも使っている写真も絶えずキャッシュを除去しています。
LruCacheの初期化コードは以下の通りです。
次に画像の具体的なロードを見て、まずコードを貼り付けます。
この方法を具体的に分析しましょう。
画像の圧縮処理がよく分からない友達に対しては、簡単に説明します。
まず画像をロードしました。
これは役割を果たしていますが、画像の幅と高さの情報を得て、圧縮画像を処理できます。
画像を圧縮してから:
コードをよく見ると、学生がdisplayBmp()方法にはフィードバックパラメータがあります。
コールバックインターフェースは以下の通りです。
あなたが使いやすいように、あなたのプロジェクトに次のような依存を追加すればいいです。
中はLruCacheに関連して、ExectorService、大図のBitmap Factory原理を処理して、view.setTag()です。
はい、多く言わないで、まず一歩ずつ来ます。
まずパッケージの種類を見てみます。どうやって使いますか?
//
String imageUrl = (String) t;
// ImageView
ImageView grid_item = holder.getView(R.id.grid_item);
// tag , ,
grid_item.setTag(imageUrl);
/**
*
*
* @param context
* :
* @param imageView
* : ImageView
* @param sourcePath
* :
* @param r_Id
* : id ,R.drowable.id;
* @param callback
* :
*/
new ImageLoader().displayBmp(mContext,grid_item, imageUrl, R.drawable.img_bg,this);
簡単ですか?次に、ImageLoaderというクラスを具体的に分析します。
携帯電話のメモリが限られていることを知っています。すべての画像をメモリに入れることはできません。だから、androidはLru Cacheの方法を提供しています。使用するアルゴリズムは最近少なくともアルゴリズムを使います。また、画像にキャッシュを入れ続けています。少なくとも使っている写真も絶えずキャッシュを除去しています。
LruCacheの初期化コードは以下の通りです。
public ImageLoader() {
// 8/1
int cacheSize = maxMemory / 8;
// LruCache
mLruCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount();
}
};
}
/**
* LruCache
*/
public void putBitmapToLruCache(String key, Bitmap bitmap) {
if (getBitmapFromLruCache(key) == null && mLruCache != null) {
mLruCache.put(key, bitmap);
}
}
/**
* LruCache
*/
public Bitmap getBitmapFromLruCache(String key) {
return mLruCache.get(key);
}
LruCacheはHashMapのようにputとgetを利用してキャッシュされたものです。次に画像の具体的なロードを見て、まずコードを貼り付けます。
/**
*
*
* @param context
* :
* @param imageView
* : ImageView
* @param sourcePath
* :
* @param r_Id
* : id ,R.drowable.id;
* @param callback
* :
*/
public void displayBmp(final Context context, final ImageView imageView, final String sourcePath, final int r_Id,
final ImageCallback callback) {
final String path;
if (!TextUtils.isEmpty(sourcePath)) {
path = sourcePath;
} else {
return;
}
// , path key
Bitmap bmp = mLruCache.get(path);
if (bmp != null) {
if (callback != null) {
//
callback.imageLoad(imageView, bmp, sourcePath);
}
// imageView.setImageBitmap(bmp);
return;
}
// bmp == null , imageView
imageView.setImageResource(r_Id);
//
threadPoolUtils.getExecutorService().execute(new Runnable() {
Bitmap bitmap = null;
@Override
public void run() {
// TODO Auto-generated method stub
try {
//
bitmap = revitionImageSize(imageView, sourcePath);
} catch (Exception e) {
}
if (bitmap == null) {
try {
//
bitmap = BitmapFactory.decodeResource(context.getResources(), r_Id);
} catch (Exception e) {
}
}
if (path != null && bitmap != null) {
// , path key
putBitmapToLruCache(path, bitmap);
}
if (callback != null) {
handler.post(new Runnable() {
@Override
public void run() {
//
callback.imageLoad(imageView, bitmap, sourcePath);
}
});
}
}
});
}
コードはあまり多くないです。主にキャッシュから画像をロードします。画像を空にすると、携帯の画像アドレスから画像をロードします。bitmap = revitionImageSize(imageView, sourcePath);
キャッシュの写真をロードして多く言いませんでした。見たのも分かります。こんなに簡単ですこの方法を具体的に分析しましょう。
public Bitmap revitionImageSize(ImageView imageView, String path) throws IOException {
// ImageView
int img_width = imageView.getWidth();
int img_height = imageView.getHeight();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(path)));
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in, null, options);
in.close();
int height = options.outHeight;
int width = options.outWidth;
Bitmap bitmap = null;
int inSampleSize = 1;
//
final int heightRatio = Math.round((float) height / (float) img_height);
final int widthRatio = Math.round((float) width / (float) img_width);
// inSampleSize ,
// 。
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
// inSampleSize
options.inSampleSize = inSampleSize;
options.inJustDecodeBounds = false;
in = new BufferedInputStream(new FileInputStream(new File(path)));
bitmap = BitmapFactory.decodeStream(in, null, options);
in.close();
return bitmap;
}
コードにもコメントが書いてありますが、画像をロードする際には一定の圧縮処理がありますので、上の処理方法もよくあります。表示する画像はイメージコントロールの大きさによって圧縮します。画像の圧縮処理がよく分からない友達に対しては、簡単に説明します。
まず画像をロードしました。
BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(path)));
そして:options.inJustDecodeBounds = true;
次に:
int height = options.outHeight;
int width = options.outWidth;
この時の注意プログラムは写真を本当に読み込んでいません。options.inJust DecodeBounds=trueです。これは役割を果たしていますが、画像の幅と高さの情報を得て、圧縮画像を処理できます。
画像を圧縮してから:
options.inJustDecodeBounds = false;
圧縮された画像を再取得:bitmap = BitmapFactory.decodeStream(in, null, options);
説明済み。コードをよく見ると、学生がdisplayBmp()方法にはフィードバックパラメータがあります。
コールバックインターフェースは以下の通りです。
/**
*
*
* @author Administrator
*
*/
public interface ImageCallback {
public void imageLoad(ImageView imageView, Bitmap bitmap, Object... params);
}
具体的な実装は、画像を表示する場所でのコールバックです。
/**
*
*/
@Override
public void imageLoad(ImageView imageView, Bitmap bitmap, Object... params) {
if (imageView != null && bitmap != null) {
String url = (String) params[0];
// url imageView.getTag()
// !!!!
if (url != null && url.equals((String) imageView.getTag())) {
((ImageView) imageView).setImageBitmap(bitmap);
}
}
}
コードの注釈のところも書いてあります。よく分からない学生は私信交流ができます。また、私のgithub github接続のソースコードを添付してください。運行の便利さが分かります。あなたが使いやすいように、あなたのプロジェクトに次のような依存を追加すればいいです。
dependencies {
compile 'com.zts:imageloader:1.1.1'
}