1. 程式人生 > >Android Glide圖片載入庫的使用

Android Glide圖片載入庫的使用

簡介

Glide是 Google推薦的圖片載入庫,它可以支援來自url,Android資源,檔案,Uri中的圖片載入,同時還支援gif圖片的載入,以及各種圖片顯示前的bitmap處理(例如:圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等),快取處理,請求優先順序處理,動畫處理,縮圖處理,圖片大小自定義等等.可謂是非常的強大.

新增依賴

 compile 'com.github.bumptech.glide:glide:3.7.0'

載入網路圖片

/**
 * Created by Greathfs on 2016/6/6.
 */
public class TestGlideActivity extends
Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); String url = "http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png"; ImageView targetView = (ImageView) findViewById(R.id.iv_target); Glide.with(this
). load(url). asBitmap(). //強制處理為bitmap into(targetView);//顯示到目標View中 } }

載入資源圖片

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        int
resourceId = R.drawable.test; ImageView targetView = (ImageView) findViewById(R.id.iv_target); Glide.with(this). load(resourceId). asBitmap(). into(targetView); } }

載入本地檔案圖片

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        File file = new File(Environment.getExternalStorageDirectory(), "test.jpg");
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(file).
                asBitmap().
                into(targetView);
    }
}

從Uri中載入

/**
 * Created by Greathfs on 2016/6/6.
 */
public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        Uri uri = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.drawable.test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(uri).
                asBitmap().
                into(targetView);
    }
}

6.載入gif圖片

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(R.drawable.smail).
                asGif().//注意:這裡顯示的指明瞭要載入的是gif圖片,當然即使不指明,glide也會自己判斷.
                into(targetView);
    }
}

設定預設圖片和載入失敗時顯示的圖片

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(R.drawable.test).
                asBitmap().
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                into(targetView);
    }
}

淡入顯示效果

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade().//淡入顯示,注意:如果設定了這個,則必須要去掉asBitmap
                into(targetView);
    }
}

另外,crossFade還可以接收一個引數來設定淡入顯示效果的持續時間,crossFade(int duration); 
如果你想直接顯示圖片,而不是淡入顯示圖片,則可以通過dontAnimate()方法設定.

調整圖片畫素大小

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade(1000).//淡入顯示的時間,注意:如果設定了這個,則必須要去掉asBitmap
                override(80,80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                into(targetView);
    }
}

設定CenterCrop,FitCenter

CenterCrop,FitCenter都是對目標圖片進行裁剪,瞭解過ImageView的ScaleType屬性就知道,這2種裁剪方式在ImageView上也是有的,分別對應ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER的.

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
                override(80,80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                centerCrop().//中心裁剪,縮放填充至整個ImageView
                into(targetView);
    }
}

快取策略設定

記憶體快取設定,通過skipMemoryCache(boolean)來設定是否需要快取到記憶體,預設是會快取到記憶體的.

/**
 * Created by Greathfs on 2016/6/6.
 */
public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
                override(80,80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                centerCrop().//中心裁剪,縮放填充至整個ImageView
                skipMemoryCache(true).//跳過記憶體快取
                into(targetView);
    }
}

磁碟快取,磁碟快取通過diskCacheStrategy(DiskCacheStrategy)來設定,DiskCacheStrategy一共有4種模式:

DiskCacheStrategy.NONE:什麼都不快取 
DiskCacheStrategy.SOURCE:僅快取原圖(全解析度的圖片) 
DiskCacheStrategy.RESULT:僅快取最終的圖片,即修改了尺寸或者轉換後的圖片 
DiskCacheStrategy.ALL:快取所有版本的圖片,預設模式

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
                override(80, 80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                centerCrop().//中心裁剪,縮放填充至整個ImageView
                skipMemoryCache(true).//跳過記憶體快取
                diskCacheStrategy(DiskCacheStrategy.RESULT).//儲存最終圖片
                into(targetView);
    }
}

快取設定

在GlideModule 中,我們可以設定磁碟快取的位置,磁碟快取的大小和記憶體快取的大小,同時還可以設定圖片的顯示質量.

要是用GlideModule ,需要建立它的實現類,然後在manifests中申明實現類的全類路徑:

<meta-data
          android:name="com.example.greathfs.httputilsdemo.image.glide.module.SimpleGlideModule"
          android:value="GlideModule" />

GlideModule 的實現類,需要實現applyOptions方法:

/**
 * 所以你知道要建立一個額外的類去定製 Glide。
 * 下一步是要全域性的去宣告這個類,讓 Glide 知道它應該在哪裡被載入和使用。
 * Glide 會掃描 AndroidManifest.xml 為 Glide module 的 meta 宣告。
 * 因此,你必須在 AndroidManifest.xml 的 &lt;application&gt; 標籤內去宣告這個SimpleGlideModule。
 * Created by mChenys on 2016/6/10.
 */
public class SimpleGlideModule implements GlideModule {
    public static DiskCache cache;

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // 在 Android 中有兩個主要的方法對圖片進行解碼:ARGB8888 和 RGB565。前者為每個畫素使用了 4 個位元組,
        // 後者僅為每個畫素使用了 2 個位元組。ARGB8888 的優勢是影象質量更高以及能儲存一個 alpha 通道。
        // Picasso 使用 ARGB8888,Glide 預設使用低質量的 RGB565。
        // 對於 Glide 使用者來說:你使用 Glide module 方法去改變解碼規則。
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
        //設定快取目錄
        File cacheDir = PathUtils.getDiskCacheDir(context, CacheConfig.IMG_DIR);

        cache = DiskLruCacheWrapper.get(cacheDir, DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE);// 250 MB
        builder.setDiskCache(new DiskCache.Factory() {
            @Override
            public DiskCache build() {
                return cache;
            }
        });
        //設定memory和Bitmap池的大小
        MemorySizeCalculator calculator = new MemorySizeCalculator(context);
        int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
        int defaultBitmapPoolSize = calculator.getBitmapPoolSize();

        int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
        int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);

        builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize));
        builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize));
    }

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

設定載入縮圖

通過設定縮圖,我們可以在顯示目標圖片之前先展示一個第解析度或者其他圖片,當全解析度的目標圖片在後臺載入完成後, 
Glide會自動切換顯示全畫素的目標圖片.

設定縮圖有2種方式: 
通過thumbnail(float)指定0.0f~1.0f的原始影象大小,例如全畫素的大小是500*500,如果設定為thumbnail為0.1f,即目標圖片的10%,顯示的縮圖大小就是50*50;

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);

        Glide.with(this).
                load(R.drawable.test).
                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
                error(R.drawable.bg_error).//載入失敗時顯示的圖片
                crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
                override(80, 80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                centerCrop().//中心裁剪,縮放填充至整個ImageView
                skipMemoryCache(true).//跳過記憶體快取
                diskCacheStrategy(DiskCacheStrategy.RESULT).//儲存最終圖片
                thumbnail(0.1f).//10%的原圖大小
                into(targetView);
    }
}

通過thumbnail(DrawableRequestBuilder)方式來指定縮圖,該縮圖可以使用load的所有方式(網路,檔案,uri,資源)載入.

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        //縮圖請求
        DrawableRequestBuilder&lt;String&gt; thumbnailRequest = Glide
                .with(this)
                .load("http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png");

        Glide.with(this).
                load(R.drawable.test).
//                placeholder(R.drawable.bg_loading).//載入中顯示的圖片
//                error(R.drawable.bg_error).//載入失敗時顯示的圖片
//                crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
                override(80, 80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
                centerCrop().//中心裁剪,縮放填充至整個ImageView
                skipMemoryCache(true).//跳過記憶體快取
                diskCacheStrategy(DiskCacheStrategy.RESULT).//儲存最終圖片
                thumbnail(thumbnailRequest).//設定縮圖
                into(targetView);
    }
}

動畫處理

通過animate()方法可以設定xml檔案定義的4種補間動畫(alpha、scale、translate、rotate) 
例如:

res\anim\left_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="-50%p"
        android:toXDelta="0"/>
    <alpha
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
</set>

使用方式:

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);
        Glide.with(this).
                load(R.drawable.test).
                asBitmap().
                animate(R.anim.left_in).//載入xml檔案定義的動畫
                into(targetView);
    }
}

處理此外,還可以通過animate指定屬性動畫:

public class TestGlideActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ImageView targetView = (ImageView) findViewById(R.id.iv_target);

        ViewPropertyAnimation.Animator animationObject = new ViewPropertyAnimation.Animator() {
            @Override
            public void animate(View view) {
                //設定屬性動畫
                ObjectAnimator moveIn = ObjectAnimator.ofFloat(view, "translationX", -500f, 0f);
                ObjectAnimator rotate = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f);
                ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f, 1f);
                ObjectAnimator moveTop = ObjectAnimator.ofFloat(view, "translationY", 0f, -2000, 0f);
                AnimatorSet animSet = new AnimatorSet();
                //先左進,然後旋轉伴隨淡入效果,最後移動向上
                animSet.play(rotate).with(fadeInOut).after(moveIn).before(moveTop);
                animSet.setDuration(5000);
                animSet.start();
            }
        };
        Glide.with(this).
                load(R.drawable.test).
                asBitmap().
                animate(animationObject).//載入屬性動畫
                into(targetView);
    }
}