項目地址:html
https://github.com/bumptech/glideandroid
Glide做爲安卓開發經常使用的圖片加載庫,有許多實用並且強大的功能,那麼,今天就來總結一番,此次把比較常見的都寫出來,但並非所有哦。git
在介紹以前,先來講說什麼是Glide吧:github
在泰國舉行的谷歌開發者論壇上,谷歌爲咱們介紹了一個名叫 Glide 的圖片加載庫,做者是bumptech。這個庫被普遍的運用在google的開源項目中,包括2014年google I/O大會上發佈的官方app。web
Glide和Picasso有90%的類似度,準確的說,就是Picasso的克隆版本。可是在細節上仍是有很多區別的。算法
Glide的使用很是方便,並且使用了鏈式編程,因此方法直接鏈接寫在後便就能夠了。如下是我日常總結的比較經常使用的Glide方法編程
1:Glide的配置canvas
compile 'com.github.bumptech.glide:glide:3.7.0'api
2最簡單的用法緩存
異步加載圖片:
Glide.with(context).load(url).into(imageView);
這是最簡單的用法了,with裏填上下文,load裏面填寫url,into填寫要下載到的控件上便可
3設置佔位圖和錯誤圖:
placeholder(R.drawable.user_placeholder)
error(R.drawable.user_placeholder_error)
4 load方法的使用
Glide基本能夠load任何能夠拿到的媒體資源,如:
load SD卡資源:load("file://"+Environment.getExternalStorageDirectory().getPath()+"/test.jpg")
load assets資源:load("file:///android_asset/f003.gif")
load raw資源:load("Android.resource://包名/raw/raw_1")
或load("android.resource://包名/raw/"+R.raw.raw_1)
load drawable資源:load("android.resource://包名/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(Uri uri),
load(File file),
load(Integer resourceId),
load(URL url),
load(byte[] model),
load(T model),
loadFromMediaStore(Uri uri)。
5設置緩存策略
diskCacheStrategy(DiskCacheStrategy.ALL)
可選策略:
DiskCacheStrategy.SOURCE:緩存原始數據;
DiskCacheStrategy.RESULT:緩存變換(如縮放、裁剪等)後的資源數據;
DiskCacheStrategy.NONE:什麼都不緩存(不進行磁盤緩存);
DiskCacheStrategy.ALL:緩存SOURC和RESULT;
默認採用DiskCacheStrategy.RESULT策略;
對於download only操做要使用DiskCacheStrategy.SOURCE;
6清空緩存
禁止內存緩存:
.skipMemoryCache(true)
清除內存緩存:
// 必須在UI線程中調用
Glide.get(context).clearMemory();
禁止磁盤緩存:
.diskCacheStrategy(DiskCacheStrategy.NONE)
清除磁盤緩存:
// 必須在後臺線程中調用,建議同時clearMemory()
Glide.get(applicationContext).clearDiskCache();
7設置請求優先級
priority(Priority.HIGH)
優先級越高越優先加載,但不保證全部圖片都按序加載。可選參數:
枚舉Priority.IMMEDIATE,Priority.HIGH,Priority.NORMAL,Priority.LOW。默認爲Priority.NORMAL。
8 設置縮略圖
thumbnail()
9 直接得到Bitmap
有些時候咱們並不但願把圖片放入ImageView中。咱們只要 Bitmap 自己。Glide 提供了一個用 Targets 的簡單的方式去接受圖片資源的 Bitmap。Targets 是回調函數,它在 Glide 作完全部的加載和處理以後返回結果。
方法1
Glide.with(this).load(url).asBitmap().into(newSimpleTarget<Bitmap>() {
@Override
public voidonResourceReady(Bitmap resource, GlideAnimation<? super Bitmap>glideAnimation) {
//resource便是得到的Bitmap
}
});
方法2
Bitmap bitmap =Glide.with(MainActivity.this).load(url).asBitmap().into(500, 500).get();
該方式只能在子線程中得到
10加載圖片到Notification中
NotificationTarget notificationTarget =
new NotificationTarget(
Context,
RemoteViews,
viewid,
notificationObject,
notifyId);
Glide.with(this).load(url).asBitmap().into(notificationTarget);
11 Glide自帶的一個漸變更畫
Glide.with(this).load(url).crossFade([duration]).into(iv2);
12加載Gif
//普通顯示GIF
Glide.with( context ).load( gifUrl ).into( iv );
//添加GIF檢查,若是不是GIF就會顯示加載失敗位圖
Glide.with( context ).load( gifUrl ).asGif().into( iv);
13顯示本地視頻
String filePath ="/storage/emulated/0/Pictures/example_video.mp4";
Glide
.with(context )
.load(Uri.fromFile( new File( filePath ) ) )
.into( iv );
Glid只能加載本地視頻,不能從網絡中獲取
14顯示圓形圖片
create(context.getResources(), resource); circularBitmapDrawable.setCircular(true); cimg.setImageDrawable(circularBitmapDrawable); } });
關於Glide就先介紹到這麼多了,通常的經常使用開發應該夠用了,謝謝你們!喜歡點個贊吧!
轉載:http://www.cnblogs.com/whoislcj/p/5558168.html
前面總結學習了圖片的使用以及Lru算法,今天來學習一下比較優秀的圖片緩存開源框架。技術自己就要不斷的更迭,從最初的本身使用SoftReference實現本身的圖片緩存,到後來作電商項目本身的實現方案不能知足項目的需求改用Afinal,因爲Afinal再也不維護而選擇了師出同門的Xutils,中間也接觸過別的開源框架好比Picasso,對Picasso的第一次印象就不太好,初次接觸是拿到了公司剛從外包公司接手過來的圖片社交類app,對內存佔用太大,直接感覺就是致使ListView滑動有那麼一點卡頓,老牌的圖片緩存框架universalImageLoader據說過一直沒有真正使用過,以前項目都很小,差很少幾百萬級別的app,一直使用的都是Xutils,最近以爲項目大起來了,萬一Xutils不維護了或者說要求支持的圖片格式多起來的時候,可能Xutils就不是最佳選擇了,這也是來學習Gilde的根本動機吧。其實原本想着去學習Facebook的Fresco圖片框架,可是簡單的看了一下,須要連同自定義控件一塊兒使用,功能雖然強大,可是對於已經在維護的項目修改爲本那可不是通常的高,之後有興趣在學習吧!
圖片緩存相關博客地址:
Glide 是 Google 員工的開源項目, Google I/O 上被推薦使用,一個高效、開源、Android設備上的媒體管理框架,它遵循BSD、MIT以及Apache 2.0協議發佈。Glide具備獲取、解碼和展現視頻劇照、圖片、動畫等功能,它還有靈活的API,這些API使開發者可以將Glide應用在幾乎任何網絡協議棧裏。建立Glide的主要目的有兩個,一個是實現平滑的圖片列表滾動效果,另外一個是支持遠程圖片的獲取、大小調整和展現。
gitHub地址:https://github.com/bumptech/glide
compile 'com.github.bumptech.glide:glide:3.7.0'
咱們能夠更加高效的使用Glide提供的方式進行綁定,這樣能夠更好的讓加載圖片的請求的生命週期動態管理起來
Glide.with(Context context);// 綁定Context Glide.with(Activity activity);// 綁定Activity Glide.with(FragmentActivity activity);// 綁定FragmentActivity Glide.with(Fragment fragment);// 綁定Fragment
Glide.with(this).load(imageUrl).into(imageView);
api裏面對placeholder()、error()函數中有多態實現 用的時候能夠具體的熟悉一下
Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);
Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);
Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);
Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
策略解說:
all:緩存源資源和轉換後的資源
none:不做任何磁盤緩存
source:緩存源資源
result:緩存轉換後的資源
api也提供了幾個經常使用的動畫:好比crossFade()
Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);
R.anim.item_alpha_in
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="500" android:fromAlpha="0.0" android:toAlpha="1.0"/> </set>
這樣會先加載縮略圖 而後在加載全圖
Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);
Glide.with(this).load(imageUrl).override(800, 800).into(imageView);
Glide.with(this).load(imageUrl).centerCrop().into(imageView);
api提供了好比:centerCrop()、fitCenter()等函數也能夠經過自定義Transformation,舉例說明:好比一我的圓角轉化器
public class GlideRoundTransform extends BitmapTransformation { private float radius = 0f; public GlideRoundTransform(Context context) { this(context, 4); } public GlideRoundTransform(Context context, int dp) { super(context); this.radius = Resources.getSystem().getDisplayMetrics().density * dp; } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return roundCrop(pool, toTransform); } private Bitmap roundCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); canvas.drawRoundRect(rectF, radius, radius, paint); return result; } @Override public String getId() { return getClass().getName() + Math.round(radius); } }
具體使用
Glide.with(this).load(imageUrl).transform(new GlideRoundTransform(this)).into(imageView);
項目中有不少須要先下載圖片而後再作一些合成的功能,好比項目中出現的圖文混排,該如何實現目標下
Glide.with(this).load(imageUrl).centerCrop().into(new SimpleTarget<GlideDrawable>() { @Override public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) { imageView.setImageDrawable(resource); } });
Glide.with(this).load(imageUrl).listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { //imageView.setImageDrawable(resource); return false; } }).into(imageView);
設置監聽的用處 能夠用於監控請求發生錯誤來源,以及圖片來源 是內存仍是磁盤
Glide.with(this).load(imageUrl).asBitmap().into(imageView);//顯示gif靜態圖片 Glide.with(this).load(imageUrl).asGif().into(imageView);//顯示gif動態圖片
Glide.get(this).clearDiskCache();//清理磁盤緩存 須要在子線程中執行 Glide.get(this).clearMemory();//清理內存緩存 能夠在UI主線程中進行