android glide圖片載入框架

發表於2017-02-06

 

 

專案地址:

https://github.com/bumptech/glide

 

Glide作為安卓開發常用的圖片載入庫,有許多實用而且強大的功能,那麼,今天就來總結一番,這次把比較常見的都寫出來,但並不是全部哦。


在介紹之前,先來說說什麼是Glide吧:

在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。

 

Glide和Picasso有90%的相似度,準確的說,就是Picasso的克隆版本。但是在細節上還是有不少區別的。

Glide的使用非常方便,而且使用了鏈式程式設計,所以方法直接連線寫在後便就可以了。以下是我平常總結的比較常用的Glide方法

 

1:Glide的配置

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

 

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簡介:

        Glide 是 Google 員工的開源專案, Google I/O 上被推薦使用,一個高效、開源、Android裝置上的媒體管理框架,它遵循BSD、MIT以及Apache 2.0協議釋出。Glide具有獲取、解碼和展示視訊劇照、圖片、動畫等功能,它還有靈活的API,這些API使開發者能夠將Glide應用在幾乎任何網路協議棧裡。建立Glide的主要目的有兩個,一個是實現平滑的圖片列表滾動效果,另一個是支援遠端圖片的獲取、大小調整和展示。

 gitHub地址:https://github.com/bumptech/glide

Glide特點

  •  使用簡單
  • 可配置度高,自適應程度高
  • 支援常見圖片格式 Jpg png gif webp
  • 支援多種資料來源  網路、本地、資源、Assets 等
  • 高效快取策略    支援Memory和Disk圖片快取 預設Bitmap格式採用RGB_565記憶體使用至少減少一半
  • 生命週期整合   根據Activity/Fragment生命週期自動管理請求
  • 高效處理Bitmap  使用Bitmap Pool使Bitmap複用,主動呼叫recycle回收需要回收的Bitmap,減小系統回收壓力

Glide簡單使用

1.)新增引用 build.gradle 中新增配置

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

2.)設定繫結生命週期

我們可以更加高效的使用Glide提供的方式進行繫結,這樣可以更好的讓載入圖片的請求的生命週期動態管理起來

  Glide.with(Context context);// 繫結Context
  Glide.with(Activity activity);// 繫結Activity
  Glide.with(FragmentActivity activity);// 繫結FragmentActivity
  Glide.with(Fragment fragment);// 繫結Fragment

 

3. )簡單的載入圖片例項

 Glide.with(this).load(imageUrl).into(imageView);

4.)設定載入中以及載入失敗圖片

api裡面對placeholder()、error()函式中有多型實現 用的時候可以具體的熟悉一下

Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);

5.)設定跳過記憶體快取

 Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);

6.)設定下載優先順序

Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);

7.)設定快取策略

Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);

策略解說:

all:快取源資源和轉換後的資源

none:不作任何磁碟快取

source:快取源資源

result:快取轉換後的資源

8.)設定載入動畫

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>
複製程式碼

9.)設定縮圖支援

這樣會先載入縮圖 然後在載入全圖

 Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);

10.)設定載入尺寸

 Glide.with(this).load(imageUrl).override(800, 800).into(imageView);

11.)設定動態轉換

 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);

12.)設定要載入的內容

專案中有很多需要先下載圖片然後再做一些合成的功能,比如專案中出現的圖文混排,該如何實現目標下

複製程式碼
        Glide.with(this).load(imageUrl).centerCrop().into(new SimpleTarget<GlideDrawable>() {
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                imageView.setImageDrawable(resource);
            }
        });
複製程式碼

13 .)設定監聽請求介面

複製程式碼
  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);
複製程式碼

 

設定監聽的用處 可以用於監控請求發生錯誤來源,以及圖片來源 是記憶體還是磁碟

15.)設定動態GIF載入方式

 Glide.with(this).load(imageUrl).asBitmap().into(imageView);//顯示gif靜態圖片
 Glide.with(this).load(imageUrl).asGif().into(imageView);//顯示gif動態圖片

 16.)快取的動態清理

 Glide.get(this).clearDiskCache();//清理磁碟快取 需要在子執行緒中執行
 Glide.get(this).clearMemory();//清理記憶體快取  可以在UI主執行緒中進行

 

相關文章