android圖片載入庫Glide4使用教程(專案中如何快速將Glide3替換成Glide4)
我想大多數人在自己的專案中還是使用Glide3.7.1這個版本吧!不過Glide版本現在已經到4.4.0了!
當我們把Glide3更換成Glide4,會發現大部分地方都報錯了,那麼該怎樣快速替換Glide3為Glide4呢?
下面我們一起來看看怎樣實現Glide3到Glide4的快速替換。
Glide4的基本用法:
- 引入Glide
implementation 'com.github.bumptech.glide:glide:4.4.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'
compiler:包含各種註解的使用,Glide3快速替換成Glide4時要用到。
- 新增網路許可權
<uses-permission android:name="android.permission.INTERNET" />
在這個地方可能你的專案會報個錯:java.lang.NoSuchMethodError
這是因為Glide4中已經引入了appcompat-v7包,版本不一致引起。
解決方法:
Glide4.4.0引入的是27.0.2版本,所以把你專案中的appcompat-v7更換為:
implementation 'com.android.support:appcompat-v7:27.0.2'
- 普通載入圖片
Glide.with (this.getApplicationContext())
.load(url)
.into(mImage);
- 佔位圖和錯誤時顯示圖片
RequestOptions options = new RequestOptions();
options.placeholder(R.drawable.ic_launcher_background);
options.error(R.mipmap.load_error);
//禁用掉Glide的快取功能
options.diskCacheStrategy (DiskCacheStrategy.NONE);
Glide.with(this.getApplicationContext())
.load(url)
.apply(options)
.into(mImage);
這裡就是Glide4和Glide3的最大不同,他將部分API功能封裝在RequestOptions 中,在通過apply方法,傳遞給Glide使用,這樣我們就可以很方便的在需要的地方可以進行不同的配置了,不用像Glide3一樣傳遞很多引數!
- 指定圖片大小
RequestOptions options1 = new RequestOptions();
//指定大小為200*100
//options1.override(200, 100);
//載入一張圖片的原始尺寸的圖片
options1.override(Target.SIZE_ORIGINAL);
Glide.with(this.getApplicationContext())
.load(url)
//請求給定係數的縮圖。如果縮圖比全尺寸圖先載入完,
// 就顯示縮圖,否則就不顯示。
// 係數sizeMultiplier必須在(0,1)之間,
// 可以遞迴呼叫該方法。
.thumbnail(0.1f)
.apply(options1)
.into(mImage);
- 禁用記憶體快取&硬碟快取功能
// DiskCacheStrategy.NONE: 表示不快取任何內容。
// DiskCacheStrategy.DATA: 表示只快取原始圖片。
// DiskCacheStrategy.RESOURCE: 表示只快取轉換過後的圖片。
// DiskCacheStrategy.ALL : 表示既快取原始圖片,也快取轉換過後的圖片。
// DiskCacheStrategy.AUTOMATIC: 表示讓Glide根據圖片資源智慧地選擇使用哪一種快取策略(預設選項)。
RequestOptions options2 = new RequestOptions()
//禁用記憶體快取
.skipMemoryCache(true)
//硬碟快取功能
.diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(this.getApplicationContext())
.load(url)
.apply(options2)
.into(mImage);
- 指定載入格式GIF
Glide.with(this.getApplicationContext())
.load("file:///android_asset/jdfw.gif")
.into(mImage);
- 獲取gif第一幀
/**
* 注意:在Glide 3中的語法是先load()再asBitmap()的,
*
* 而在Glide 4中是先asBitmap()再load()的
*
* 如果寫錯了順序就肯定會報錯了
*/
Glide.with(this.getApplicationContext())
//.asBitmap()//強制指定載入靜態圖片
//.asGif()//強制指定載入動態圖片
//.asFile()//強制指定檔案格式的載入
.asDrawable()//強制指定Drawable格式的載入
.load("file:///android_asset/jdfw.gif")
.into(mImage);
- 回撥與監聽
/**
* 回撥與監聽
*/
SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
mImage.setImageDrawable(resource);
}
};
Glide.with(this.getApplicationContext())
.load(url)
.into(simpleTarget);
- 預載入後顯示
預載入
Glide.with(this)
.load("https://unsplash.it/200/200?random&22")
.preload();
預載入後顯示
Glide.with(this.getApplicationContext())
.load("https://unsplash.it/200/200?random&22")
.into(mImage);
- submit()方法:類似Glide3中的downloadOnly
new Thread(new Runnable() {
@Override
public void run() {
try {
final Context context = getApplicationContext();
FutureTarget<File> target = Glide.with(context)
//.asDrawable()
.asFile()
.load(url)
.submit();
//final Drawable drawable = target.get();
final File imageFile = target.get();
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextview.setText(imageFile.getPath());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
- listener()方法
Glide.with(this.getApplicationContext())
.load(url)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
mTextview.setText("載入失敗");
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
mTextview.setText("載入成功");
return false;
}
})
.into(mImage);
- 圖片變換(圓角等)
RequestOptions options3 = new RequestOptions();
//options3.centerCrop();
// options3.fitCenter();
options3.circleCrop();
Glide.with(this.getApplicationContext())
.load("https://unsplash.it/200/200?random&55")
.apply(options3)
.into(mImage);
自定義模組
在Glide3中定義了自定義模組之後,還必須在AndroidManifest.xml檔案中去註冊它才能生效,而在Glide 4中是不需要的,因為@GlideModule這個註解已經能夠讓Glide識別到這個自定義模組了(記得Build -> Rebuild Project)!
package tsou.com.simple.glide4test.glidemodule;
import android.content.Context;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.Registry;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory;
import com.bumptech.glide.module.AppGlideModule;
/**
* Created by Administrator on 2017/12/22 0022.
* 在Glide3中需要在AndroidManifest.xml中配置
* <p>
* Glide4,只要有@GlideModule註解就好
*/
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
public static final int DISK_CACHE_SIZE = 500 * 1024 * 1024;
public static final String DISK_CACHE_NAME = "huangxiaoguo";
@Override
public void applyOptions(Context context, GlideBuilder builder) {
super.applyOptions(context, builder);
/**
將所有Glide載入的圖片快取到SD卡上,
預設硬碟快取大小都是250M,這裡改為500
* */
//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
/**
ExternalCacheDiskCacheFactory的預設快取路徑
是在sdcard/Android/data/包名/cache/image_manager_disk_cache目錄當中
*/
//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_SIZE));
/**
* 更改快取最總資料夾名稱
*
* 是在sdcard/Android/data/包名/cache/DISK_CACHE_NAME目錄當中
*/
//此方法在Glide4已過時
// builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_NAME, DISK_CACHE_SIZE));
builder.setDiskCache(new ExternalPreferredCacheDiskCacheFactory(context, DISK_CACHE_NAME, DISK_CACHE_SIZE));
/**
* Glide也能使用ARGB_8888的圖片格式
* 雖然圖片質量變好了,但同時記憶體開銷也會明顯增大
*/
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}
@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
super.registerComponents(context, glide, registry);
}
}
- 預設快取路徑
- 設定快取路徑為SD卡
Glide3替換成Glide4(Generated API)
在自定義模組完成以後,就可以使用Glide的模式啦!請看:
//使用Generated API(類似Glide3用法)
//使用GlideApp,首先確保你的程式碼中有一個自定義的模組,
// 並且給它加上了@GlideModule註解,也就是自定義模組
GlideApp.with(this.getApplicationContext())
.load(url)
.placeholder(R.drawable.ic_launcher_background)
.error(R.mipmap.load_error)
.skipMemoryCache(true)//清除快取
.diskCacheStrategy(DiskCacheStrategy.NONE)//表示既快取原始圖片,也快取轉換過後的圖片
.override(Target.SIZE_ORIGINAL)
.circleCrop()//切圓
.into(mImage);
把之前Glide替換成GlideApp,就可以使用Glide3的方式進行使用了!是不是很方便!
定製自己的API
定製自己的API需要藉助@GlideExtension和@GlideOption這兩個註解。建立一個我們自定義的擴充套件類
package tsou.com.simple.glide4test.glidemodule;
import com.bumptech.glide.annotation.GlideExtension;
import com.bumptech.glide.annotation.GlideOption;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import tsou.com.simple.glide4test.R;
/**
* Created by Administrator on 2017/12/25 0025.
*/
@GlideExtension
public class MyGlideExtension {
/**
* 將這個類的建構函式宣告成private,這是必須要求的寫法
*/
private MyGlideExtension() {
}
@GlideOption
public static void myGlideConfiguration(RequestOptions options) {
//佔位圖
options.placeholder(R.drawable.ic_launcher_background);
//錯誤圖片
options.error(R.mipmap.load_error);
//表示只快取原始圖片
options.diskCacheStrategy(DiskCacheStrategy.DATA);
//切圓
options.circleCrop();
//...等等所有的屬性
}
}
使用自定義API方式
GlideApp.with(this.getApplicationContext())
.load(url)
.myGlideConfiguration()//自定義API
.into(mImage);
這樣,我們就可以直接使用自己的API了,同時所有的Glide配置都在MyGlideExtension 進行配置,方便專案中的同意修改!
到此Glide4的基本使用到此結束,希望對你有所幫助!
同時歡迎大家的指教,謝謝!
Glide4的使用方式雖然和Glide3不同,但是主要的功能卻和Glide3一樣,其他關於Glide4的功能在這裡沒有詳細給出,需要了解,請看: