Glide框架的基本使用

Glide框架下载地址:   https://github.com/bumptech/glide

1、环境配置

首先在Android studio中导入依赖


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

需要support-v4库的支持,如果你的项目没有support-v4库(项目默认已经添加了),还需要添加support-v4依赖:


compile 'com.android.support:support-v4:23.3.0'

然后配置混淆:


//不混淆所有的GlideModule
-keep public class * implements com.bumptech.glide.module.GlideModule

-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}

记得在清单文件中添加相应的权限:


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2、基本使用

Glide.with(this)
.load(url)//加载图片
.placeholder(R.mipmap.ic_launcher)//正在加载时的图片
.error(R.mipmap.ic_launcher)//加载错误时的图片
.into(glide_image);
.transform(new CircleTransform(this)) //通过Glide的TransForMation 自定义圆形图片的bitmap

Glide.with()使用

  1. with(Context context):使用Application上下文,Glide请求将不受Activity/Fragment生命周期控制。
  2. with(Activity activity):使用Activity作为上下文,Glide的请求会受到Activity生命周期控制。
  3. with(FragmentActivity activity):Glide的请求会受到FragmentActivity生命周期控制。
  4. with(android.app.Fragment fragment):Glide的请求会受到Fragment 生命周期控制。
  5. with(android.support.v4.app.Fragment fragment):Glide的请求会受到Fragment生命周期控制。

Glide基本本可以load任何可以拿到的媒体资源,如: 
  • load(String string)
  • 
    
    load SD卡资源:load("file://"+ Environment.getExternalStorageDirectory().getPath()+"/test.jpg")
    load assets资源:load("file:///android_asset/f003.gif")
    load raw资源:load("Android.resource://com.frank.glide/raw/raw_1")
    load("android.resource://com.frank.glide/raw/"+R.raw.raw_1)
    load drawable资源:load("android.resource://com.frank.glide/drawable/news")
    load("android.resource://com.frank.glide/drawable/"+R.drawable.news)
    load ContentProvider资源:load("content://media/external/images/media/139469")
    load http资源:load("http://img.my.csdn.net/uploads/201508/05/1438760757_3588.jpg")
    load https资源:load("https://img.alicdn.com/tps/TB1uyhoMpXXXXcLXVXXXXXXXXXX-476-538.jpg_240x5000q50.jpg_.webp")
     
当然,load不限于String类型,还可以: 
  • load(File file):@param file:The File containing the image。
  • load(Integer resourceId):@param resourceId :the id of the resource containing the image。可以用R.drawable或R.mipmap
  • load(Uri uri):@param uri:The Uri representing the image. Must be of a type handled by UriLoader
  • load(byte[] model):@param model:the data to load.
  • loadFromMediaStore(Uri uri):@param uri:The uri representing the media.
  • load(T model):@param model:The model the load.
  • load(URL url):deprecated

3、其他使用
禁止内存缓存:

Glide.skipMemoryCache(true)

清除内存缓存:

// 必须在UI线程中调用
Glide.get(context).clearMemory();

禁止磁盘缓存:

Glide.diskCacheStrategy(DiskCacheStrategy.NONE)

清除磁盘缓存:

// 必须在后台线程中调用,建议同时clearMemory()
Glide.get(applicationContext).clearDiskCache();

获取缓存大小:

new GetDiskCacheSizeTask(textView).execute(new File(getCacheDir(), 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 static 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;
}
}

指定资源的优先加载顺序:

//优先加载
Glide
.with(context)
.load(heroImageUrl)
.priority(Priority.HIGH)
.into(imageViewHero);
//后加载
Glide
.with(context)
.load(itemImageUrl)
.priority(Priority.LOW)
.into(imageViewItem);

先显示缩略图,再显示原图:

//用原图的1/10作为缩略图
Glide
.with(this)
.load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
.thumbnail(0.1f)
.into(iv_0);
//用其它图片作为缩略图
DrawableRequestBuilder<Integer> thumbnailRequest = Glide
.with(this)
.load(R.drawable.news);
Glide.with(this)
.load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
.thumbnail(thumbnailRequest)
.into(iv_0);

对图片进行裁剪、模糊、滤镜等处理: 
推荐使用独立的图片处理库:wasabeef/glide-transformations,使用也很简单:

compile 'jp.wasabeef:glide-transformations:2.0.0'
之后我们就可以使用GenericRequestBuilder或其子类的transform()bitmapTransform()方法设置图片转换了:

//圆形裁剪
Glide.with(this)
.load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
.bitmapTransform(new CropCircleTransformation(this))
.into(iv_0);
//圆角处理
Glide.with(this)
.load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
.bitmapTransform(new RoundedCornersTransformation(this,30,0, RoundedCornersTransformation.CornerType.ALL))
.into(iv_0);
//灰度处理
Glide.with(this)
.load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
.bitmapTransform(new GrayscaleTransformation(this))
.into(iv_0);
//其它变换...

4、基于Glide的优秀库

1.glide-transformations

一个基于Glide的transformation库,拥有裁剪,着色,模糊,滤镜等多种转换效果。

2.GlidePalette

一个可以在Glide加载时很方便使用Palette的库。



Glide框架就介绍到这了,详细使用,请参考以下资料:

中文教程:https://mrfu.me/2016/02/27/Glide_Getting_Started/
详谈高图片加载框架Glide -应用篇: http://www.jianshu.com/p/cea08d72ad4c 
Glide框架的基本使用