到目前為止,網(wǎng)上有很多圖片加載庫(kù)扑媚,我就先來(lái)說(shuō)說(shuō)為什么選擇Glide來(lái)學(xué)習(xí)老玛。
Glide的特點(diǎn)
- 顯示圖片平緩流暢速度快
- 支持gif和webp格式圖片
- 擴(kuò)展性高可以轉(zhuǎn)換各種圖片效果
- 根據(jù)Activity/Fragment生命周期自動(dòng)管理請(qǐng)求
- ...
其它圖片加載庫(kù)有的Glide都有演怎,這里的特點(diǎn)是其它加載庫(kù)沒(méi)有的,還有很多特點(diǎn)這里就不一一列舉渊啰,是不是覺(jué)得很心動(dòng),下面我們就來(lái)學(xué)習(xí)怎么使用Glide吧~
github地址:https://github.com/bumptech/glide
這里主要是介紹在Andrid Studio上使用
配置環(huán)境
在builde.gradle里面添加上
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
要說(shuō)明的是glide是要依賴于support liberary v4
在AndroidManifest.xml添加所需權(quán)限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
基本使用
ImageView imageView = (ImageView)findViewById(R.id.my_image_view);
Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);
是不是特別簡(jiǎn)單一行代碼就搞定
常用配置
- 設(shè)置圖片格式
- 設(shè)置緩存目錄(data或SD卡)
- 設(shè)置內(nèi)存和硬盤緩存大小
創(chuàng)建MyGlideModule.java(名字可以隨便取)實(shí)現(xiàn)GlideModule接口申屹,實(shí)現(xiàn)里面兩個(gè)方法
public class MyGlideModule implements GlideModule{
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//設(shè)置格式
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
//緩存到data目錄下最大50M
//緩存目錄為程序內(nèi)部緩存目錄/data/data/your_package_name/image_manager_disk_cache/(不能被其它應(yīng)用訪問(wèn))且緩存最大為250MB
builder.setDiskCache(new InternalCacheDiskCacheFactory(context,DiskCache.Factory.DEFAULT_DISK_CACHE_DIR,DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE));
//緩存到外部磁盤SD卡上,字節(jié)
//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,DiskCache.Factory.DEFAULT_DISK_CACHE_DIR, DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE));
//設(shè)置內(nèi)存緩存大小
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.register(ImageFid.class,InputStream.class, new ImageFidLoader.Factory());
}
}
在AndroidManifest.xml配置走搁,需要把包名更換成大家項(xiàng)目中MyGlideModule的包名
<application
...>
<meta-data
android:name="包名.MyGlideModule"
android:value="GlideModule" />
</application>
設(shè)置格式ARGB_8888
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
設(shè)置緩存到data目錄下
/data/data/your_package_name/image_manager_disk_cache/
DiskCache.Factory.DEFAULT_DISK_CACHE_DIR為默認(rèn)緩存目錄名image_manager_disk_cache,可以修改自己想要的名稱
DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE為默認(rèn)緩存大小250M,參數(shù)單位是字節(jié)Byte,250M則是 250 ×1024×1024Byte
builder.setDiskCache(
new InternalCacheDiskCacheFactory(context,
DiskCache.Factory.DEFAULT_DISK_CACHE_DIR,
DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE));
設(shè)置緩存到SD卡下
builder.setDiskCache(
new ExternalCacheDiskCacheFactory(context,
DiskCache.Factory.DEFAULT_DISK_CACHE_DIR,
DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE));
設(shè)置內(nèi)存緩存大小,這里設(shè)置的是默認(rèn)大小的1.2倍私植,默認(rèn)大小是多少還沒(méi)有測(cè)試下,大家可以運(yùn)行打印一下看看
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));
獲取緩存大小和清除緩存
- 清除內(nèi)存緩存
public void clearMemory(Context context){
// 必須在UI線程中調(diào)用
Glide.get(context).clearMemory();
}
- 清除磁盤緩存
public void clearDiskCache(Context context){
// 必須在后臺(tái)線程中調(diào)用车酣,建議同時(shí)clearMemory()
Glide.get(context).clearDiskCache();
}
- 清除view緩存
public void clearViewCache(View view){
Glide.clear(view);
}
- 獲取緩存大小
public void getDiskCacheSize(Context context,TextView textView){
//獲取data下
new GetDiskCacheSizeTask(textView).execute(new File(context.getCacheDir(),DiskCache.Factory.DEFAULT_DISK_CACHE_DIR));
//獲取sd卡下
//new GetDiskCacheSizeTask(textView).execute(new File(context.getExternalCacheDir(),DiskCache.Factory.DEFAULT_DISK_CACHE_DIR));
}
class GetDiskCacheSizeTask extends AsyncTask<File, Long, Long>{
private final TextView resultView;
public GetDiskCacheSizeTask(TextView resultView) {
this.resultView = resultView;
}
@Override
protected void onPreExecute() {
resultView.setText("Calculating...");
}
@Override
protected void onProgressUpdate(Long... values) { /* onPostExecute(values[values.length - 1]); */ }
@Override
protected Long doInBackground(File... dirs) {
try {
long totalSize = 0;
for (File dir : dirs) {
publishProgress(totalSize);
totalSize += calculateSize(dir);
}
return totalSize;
} catch (RuntimeException ex) {
final String message = String.format("Cannot get size of %s: %s", Arrays.toString(dirs), ex);
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
resultView.setText("error");
Toast.makeText(resultView.getContext(),message,Toast.LENGTH_LONG).show();
}
});
}
return 0L;
}
@Override
protected void onPostExecute(Long size) {
String sizeText = android.text.format.Formatter.formatFileSize(resultView.getContext(), size);
resultView.setText(sizeText);
}
private long calculateSize(File dir) {
if (dir == null) return 0;
if (!dir.isDirectory()) return dir.length();
long result = 0;
File[] children = dir.listFiles();
if (children != null)
for (File child : children)
result += calculateSize(child);
return result;
}
}
加載本地資源轉(zhuǎn)換
//SD卡下圖片
public String getSDSource(String fullPath){
return "file://"+ fullPath;
}
//ASSETS下圖片
public String getAssetsSource(String fileName){
return "file:///android_asset/"+fileName;
}
//Raw下視頻可以解析一張圖片
public String getRawSource(Context context,int rawRid){
return "android.resource://"+context.getPackageName()+"/raw/"+rawRid;
}
//Drawable圖片
public String getDrawableSource(Context context,int drawRid){
return "android.resource://"+context.getPackageName()+"/drawable/"+drawRid;
}
常用方法
Glide.with(context)
.load(url) //加載資源
.thumbnail(0.1f) //用原圖的1/10作為縮略圖,如果縮略圖比全尺寸圖先加載完湖员,就顯示縮略圖贫悄,否則就不顯示
//.thumbnail(getDrawableRequestBuilder(context,rid)) //本地資源作為縮略圖
.centerCrop() //設(shè)置scaleType
.placeholder(null) //設(shè)置資源加載過(guò)程中的占位Drawable。
.crossFade() //設(shè)置加載漸變動(dòng)畫
.priority(Priority.NORMAL) //指定加載的優(yōu)先級(jí)娘摔,優(yōu)先級(jí)越高越優(yōu)先加載,但不保證所有圖片都按序加載凳寺。枚舉Priority.IMMEDIATE,Priority.HIGH逆趋,Priority.NORMAL晒奕,Priority.LOW。默認(rèn)為Priority.NORMAL脑慧。
.fallback(null) //設(shè)置model為空時(shí)要顯示的Drawable闷袒。如果沒(méi)設(shè)置fallback,model為空時(shí)將顯示error的Drawable霜运,如果error的Drawable也沒(méi)設(shè)置,就顯示placeholder的Drawable藕各。
.error(null) //設(shè)置load失敗時(shí)顯示的Drawable焦除。
.listener(listener) //請(qǐng)求監(jiān)聽(tīng)
.skipMemoryCache(true) //設(shè)置跳過(guò)內(nèi)存緩存,但不保證一定不被緩存(比如請(qǐng)求已經(jīng)在加載資源且沒(méi)設(shè)置跳過(guò)內(nèi)存緩存乌逐,這個(gè)資源就會(huì)被緩存在內(nèi)存中)。
.diskCacheStrategy(DiskCacheStrategy.RESULT) //緩存策略DiskCacheStrategy.SOURCE:緩存原始數(shù)據(jù)绢慢,DiskCacheStrategy.RESULT:緩存變換(如縮放、裁剪等)后的資源數(shù)據(jù)洛波,DiskCacheStrategy.NONE:什么都不緩存,DiskCacheStrategy.ALL:緩存SOURC和RESULT缚窿。默認(rèn)采用DiskCacheStrategy.RESULT策略焰扳,對(duì)于download only操作要使用DiskCacheStrategy.SOURCE。
.bitmapTransform(new CropCircleTransformation(context)) //圓角裁切
.into(imageView);
.thumbnail(0.1f)
用原圖的1/10作為縮略圖,如果縮略圖比全尺寸圖先加載完扫茅,就顯示縮略圖畜份,否則就不顯示
.thumbnail(getDrawableRequestBuilder(context,rid))
用本地資源作為縮略圖
public DrawableRequestBuilder<Integer> getDrawableRequestBuilder(Context context,int drawRid){
return Glide
.with(context)
.load(drawRid);
}
.placeholder(Drawable)
設(shè)置資源加載過(guò)程中的占位Drawable
.fallback(Drawable)
設(shè)置為空顯示的Drawable
.error(Drawable)
設(shè)置加載失敗顯示的Drawable
.crossFade()
設(shè)置加載漸變動(dòng)畫
.diskCacheStrategy(DiskCacheStrategy.RESULT)
設(shè)置緩存策略爆雹,DiskCacheStrategy.SOURCE:緩存原始數(shù)據(jù)愕鼓,DiskCacheStrategy.RESULT:緩存變換(如縮放、裁剪等)后的資源數(shù)據(jù)册倒,DiskCacheStrategy.NONE:什么都不緩存磺送,DiskCacheStrategy.ALL:緩存SOURC和RESULT。默認(rèn)采用DiskCacheStrategy.RESULT策略崇呵,對(duì)于download only操作要使用DiskCacheStrategy.SOURCE馅袁。
轉(zhuǎn)換圖片效果
在builde.gradle里面添加上
compile 'jp.wasabeef:glide-transformations:2.0.1'
github地址:https://github.com/wasabeef/glide-transformations
.bitmapTransform(new RoundedCornersTransformation(context,30,0, RoundedCornersTransformation.CornerType.ALL))
圓角處理
.bitmapTransform(new CropCircleTransformation(context))
圓形處理
..bitmapTransform(new GrayscaleTransformation(context))
灰度處理
...等等還有很多效果,感興趣的可以上github上找找api嘗試一些其它效果
如果想自定義圖片效果也是可以滴
public class MyTransformation extends BitmapTransformation{
public MyTransformation(Context context) {
super(context);
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform,int outWidth, int outHeight) {
Bitmap result = pool.get(outWidth, outHeight, Bitmap.Config.ARGB_8888);
// 如果BitmapPool中找不到符合該條件的Bitmap犹褒,get()方法會(huì)返回null叠骑,就需要我們自己創(chuàng)建Bitmap了
if (result == null) {
// 如果想讓Bitmap支持透明度,就需要使用ARGB_8888
result = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);
}
//創(chuàng)建最終Bitmap的Canvas.
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setAlpha(128);
// 將原始Bitmap處理后畫到最終Bitmap中
canvas.drawBitmap(toTransform, 0, 0, paint);
// 由于我們的圖片處理替換了原始Bitmap疙赠,就return我們新的Bitmap就行朦拖。
// Glide會(huì)自動(dòng)幫我們回收原始Bitmap。
return result;
}
@Override
public String getId() {
// 返回代表該變換的唯一Id捍岳,會(huì)作為cache key的一部分睬隶。
// 注意:最好不要用getClass().getName(),因?yàn)槿菀资芑煜绊懸肌H绻儞Q過(guò)程不影響緩存數(shù)據(jù)恤左,可以返回空字符串飞袋。
return "com.example.myapp.MyTransformation";
}
}
Glide的學(xué)習(xí)也就到這里了,目前還沒(méi)有在項(xiàng)目中用起來(lái)巧鸭,大家用的過(guò)程中可能會(huì)碰到一些問(wèn)題纲仍,歡迎給我評(píng)論留言,共同交流學(xué)習(xí)進(jìn)步郑叠。
后面我也會(huì)陸續(xù)寫一些其它庫(kù)的學(xué)習(xí)文章锻拘,希望大家多多關(guān)注支持哈~
好記性不如爛筆頭击蹲!