アンウ.ImageLoader_二次サンプリング

13674 ワード

使用するウェブサイト:http://www.jianshu.com/p/1490965760c9
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);
                    }
                });
            }
        });