1. 程式人生 > >圖片載入控制元件Glide的使用

圖片載入控制元件Glide的使用

Glide是一款bumptech釋出,並被Google推薦使用的圖片載入庫。專案地址是https://github.com/bumptech/glide,本文不會對Glide的記憶體佔用和效能進行分析,只是介紹Glide的基本用法。

匯入庫

  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:19.1.0'

基本操作

    Glide.with(context)     //關聯activity或fragment的生命週期
        .load(url)          //載入地址(url,資源id,本地圖片file)
.placeholder(id) //未載入時的佔位圖 .error(id) //載入失敗時的佔位圖 .into(ImageView); //載入物件

基本配置

Glide的配置是通過實現GlideModule介面來設定。

public class MyGlideModule implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
    }

    @Override
public void registerComponents(Context context, Glide glide) { } }

然後需要在AndroidManifest.xml中宣告

        <meta-data
            android:name="com.shangbang.store.base.MyGlideModule"
            android:value="GlideModule" />

由於Glide是通過反射將GlideModule例項化得,所以需要在混淆檔案中加入
-keep public class * implements com.bumptech.glide.module.GlideModule

接下來介紹一些Glide的常用配置

  • 配置圖片本地快取位置和本地快取大小
    public void applyOptions(final Context context, GlideBuilder builder) {
        builder.setDiskCache(new DiskCache.Factory() {
            @Override
            public DiskCache build() {
                //快取的資料夾
                File cacheLocation = new File(context.getExternalCacheDir(), "glide");
                if (!cacheLocation.exists())
                    cacheLocation.mkdirs();
                return DiskLruCacheWrapper.get(cacheLocation, 250 * 1024 * 1024);//本地快取的大小
            }
        });
    }
  • 設定解碼格式
    Glide預設的採用的使RGB_565,如果你對圖片的質量要求較高可以採用ARGB_8888格式,缺點是ARGB_8888的記憶體佔用是RGB_565的兩倍。此外,ARGB_8888是支援透明格式的,而RGB_565不支援。
    有時候發現白色的圖片變成淡綠色,可以採用ARGB_8888格式來解決這個問題。
     public void applyOptions(final Context context, GlideBuilder builder) {
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

特殊要求的使用

  • 快取策略
     .diskCacheStrategy(Type)   //設定快取到本地的策略
    DiskCacheStrategy.NONE      //不會快取到本地
    DiskCacheStrategy.SOURCE    //只快取原圖
    DiskCacheStrategy.RESULT    //只快取最終影象(預設)
    DiskCacheStrategy.ALL       //快取所有影象

在這裡有一個問題,有時候會發現當正常使用Glide時,Glide.with(context).load(url).into(imageView); 可能會導致原來的圖片白色變成淡綠色,可以選擇設定DiskCacheStrategy.SOURCE來解決這個問題。

  • 圖片格式設定
    Glide中給了兩種圖片的放入格式,需要注意的是使用Glide的圖片格式時就不要在ImageView中設定scaleType了,否則可能會使Glide的圖片格式失效。
        .centerCrop()       //自適應控制元件大小
        .fitCenter()        //適應圖片大小

type

  • 載入優先順序
        .priority(TYPE)     //優先順序由低到高
        Priority.LOW
        Priority.NORMAL
        Priority.HIGH
        Priority.IMMEDIATE
  • 縮圖
 Glide.with(this)
                .load("http://my.csdn.net/uploads/201205/06/1336311585_2632.gif")
                .thumbnail(0.1f)
                .into(iv);

利用thumbnail(0.1f)來設定先載入0.1f的縮圖顯示,然後再載入需要的圖
縮圖

原圖

  • 自定義圖片轉化
    這裡以製作圓形頭像為例介紹.transform()的使用
 Glide.with(context)
                .load(url)
                .transform(new CircleTransform(context))
                .into(imageView);
public class CircleTransform extends BitmapTransformation {
    public CircleTransform(Context context) {
        super(context);
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool,toTransform);
    }
    private  Bitmap circleCrop(BitmapPool pool, Bitmap source) {

        int size = Math.min(source.getWidth(), source.getHeight());

        int width = (source.getWidth() - size) / 2;
        int height = (source.getHeight() - size) / 2;

        Bitmap bitmap = pool.get(size, size, Bitmap.Config.ARGB_8888);
        if (bitmap == null) {
            bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        BitmapShader shader =
                new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
        if (width != 0 || height != 0) {
            // source isn't square, move viewport to center
            Matrix matrix = new Matrix();
            matrix.setTranslate(-width, -height);
            shader.setLocalMatrix(matrix);
        }
        paint.setShader(shader);
        paint.setAntiAlias(true);

        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);

        return bitmap;
    }

    @Override
    public String getId() {
        return getClass().getName();
    }
}

  • 回撥bitmap
private SimpleTarget target = new SimpleTarget<Bitmap>( 250, 250 ) { //250,250可不加,表示原圖大小 
        @Override
        public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
            imageView2.setImageBitmap( bitmap );
        }
    };
Glide
            .with( context.getApplicationContext() ) // safer!
            .load( url )
            .asBitmap()
            .into( target );

利用這種方法可以直接獲得bitmap,然後可以根據需要對Bitmap進行處理