【Android 進階】圖片載入架構之Glide

來源:互聯網
上載者:User

標籤:mod   重要   oid   ...   xtend   builder   webp   track   request   

簡單介紹

在泰國舉行的Google開發人員論壇上,Google為我們介紹了一個名叫 Glide 的圖片載入庫,作者是 bumptech。這個庫被廣泛的運用在 google 的開源項目中,包含 2014 年 google I/O 大會上公布的官方 app。

特點

(1)使用簡單
(2)可配置度高,自適應程度高
(3)支援常見圖片格式 : Jpg png gif webp
(4)支援多種資料來源: 網路、本地、資源、Assets 等
(5)高效緩衝策略: 支援 Memory 和 Disk 圖片緩衝,預設 Bitmap 格式採用 RGB_565, 記憶體使用量至少降低一半.
(6)生命週期整合: 依據 Activity/Fragment 生命週期自己主動管理請求
(7)高效處理 Bitmap : 使用Bitmap Pool 使 Bitmap 複用,主動調用 recycle 回收須要回收的 Bitmap,減小系統回收壓力.

功能API介紹:1)簡單使用:
Glide    .with(this)    .load("http://xxx.com/source/a.png")    .into(imageView);
2)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 生命週期控制。

3)load() 的使用

Glide 基本能夠 load 不論什麼能夠拿到的媒體資源

  • SD 記憶卡資源:
    load(“file://”+ Environment.getExternalStorageDirectory().getPath()+”/test.jpg”)
  • assets 資源:
    load(“file:///android_asset/3.gif”)
  • raw 資源:
    load(“Android.resource://com.frank.glide/raw/raw_1”) 或load(“android.resource://com.frank.glide/raw/”+R.raw.raw_1)
  • drawable 資源:
    load(“android.resource://com.veyron.glide/drawable/news”)或load(“android.resource://comveyron.glide/drawable/”+R.drawable.news)
  • ContentProvider 資源:
    load(“content://media/external/images/media/139469”)
  • http 資源:
    load(“http://img.my.csdn.NET/uploads/201508/05/1438760757_3588.jpg“)
  • 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)。 
4)重要功能
(1)禁止記憶體緩衝: .skipMemoryCache(true)(2)清除記憶體緩衝: // 必須在UI線程中調用    Glide.get(context).clearMemory();(3)禁止磁碟緩衝: .diskCacheStrategy(DiskCacheStrategy.NONE) (4)清除磁碟緩衝: // 必須在後台線程中調用。建議同一時候clearMemory()   Glide.get(applicationContext).clearDiskCache(); (5)擷取緩衝大小: 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;}@Overrideprotected void onPreExecute() {    resultView.setText("Calculating...");}@Overrideprotected void onProgressUpdate(Long... values) { /* onPostExecute(values[values.length - 1]); */ }@Overrideprotected 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;}@Overrideprotected 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;}}(6)指定資源的優先載入順序://優先載入    Glide        .with(context)        .load(heroImageUrl)        .priority(Priority.HIGH)        .into(imageViewHero);    //後載入    Glide        .with(context)        .load(itemImageUrl)        .priority(Priority.LOW)        .into(imageViewItem);(7)先顯示縮圖,再顯示原圖://用原圖的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);(8)對圖片進行裁剪、模糊、濾鏡等處理:詳細看demo原始碼
5)部分api介紹:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVhZl8xMzA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="這裡寫圖片描寫敘述" title="">

補充:

CenterCrop CenterCrop() 是一個裁剪技術,即縮放映像讓它填充到 ImageView 界限內而且裁剪額外的部分。ImageView 可能會全然填充,但映像可能不會完整顯示。FitCenter fitCenter() 也是裁剪技術,即縮放映像讓映像都測量出來等於或小於 ImageView 的邊界範圍。該映像將會全然顯示,但可能不會填滿整個 ImageView。
使用步驟:

1)在 build.gradle 中加入依賴:

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

2)假設你的項目沒有 support-v4 庫,還須要加入 support-v4 依賴:

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

3)假設使用變換。能夠加入一個自己定義的變換庫
加入依賴:

compile ‘jp.wasabeef:glide-transformations:2.0.1‘    // If you want to use the GPU Filterscompile ‘jp.co.cyberagent.android.gpuimage:gpuimage-library:1.3.0‘   
DemoExampleForGlide後話

歡迎關注我的公眾號
不僅僅是原創技術文章,很多其他的是對生活的思考總結

【Android 進階】圖片載入架構之Glide

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.