1. 程式人生 > >整理Glide方法使用含義(毛玻璃效果,實現圓角等)

整理Glide方法使用含義(毛玻璃效果,實現圓角等)

現在專案中一般使用Glide進行圖片載入,於是找一下他的各個方法的使用,方便使用而已。

新增依賴:

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

基本使用:

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

強大的Glide.with()


    with(Context context). 使用Application上下文,Glide請求將不受Activity/Fragment生命週期控制。最常用(可以解決部分記憶體洩漏問題)

    with(Activity activity).使用Activity作為上下文,Glide的請求會受到Activity生命週期控制。

    with(FragmentActivity activity).Glide
的請求會受到FragmentActivity生命週期控制。 with(android.app.Fragment fragment).Glide的請求會受到Fragment 生命週期控制。 with(android.support.v4.app.Fragment fragment).Glide的請求會受到Fragment生命週期控制。

強大的.load()

load(Uri uri),

load(File file),

load(Integer resourceId),

load(URL url),

load(byte[] model),

load(T model),

loadFromMediaStore(Uri uri)。 
1load SD卡資源:

load("file://"+Environment.getExternalStorageDirectory().getPath()+"/xxx.jpg")

2load assets資源:

load("file:///android_asset/xxx.gif") 

3load drawable資源(可以是圖片也可以是gif):

load(R.drawable.xxx)

4load mipmap資源(可以是圖片也可以是gif):

load(R.mipmap.xxx)

5load raw資源:

load("android.resource://包名/raw/raw_1"
) 或load("android.resource://包名/raw/"+R.raw.raw_1) 或load(R.raw.raw_1) 6load ContentProvider資源: load("content://media/external/images/media/139469") 7load http資源: load("http://xxxxxxx.jpg") 8load https資源: load("https://xxxxxxx.jpg")

常用方法:

1、thumbnail(float sizeMultiplier)

 請求給定係數的縮圖。如果縮圖比全尺寸圖先載入完,就顯示縮圖,否則就不顯示。係數sizeMultiplier必須在(0,1)之間,可以遞迴呼叫該方法。

2、sizeMultiplier(float sizeMultiplier)

 在載入資源之前給Target大小設定係數。用於裝載縮圖,避免載入大量資源。

3、 diskCacheStrategy(DiskCacheStrategy strategy)

設定快取策略。

DiskCacheStrategy.SOURCE:快取原始資料,
DiskCacheStrategy.RESULT:快取變換(如縮放、裁剪等)後的資源資料,
DiskCacheStrategy.NONE:什麼都不快取,
DiskCacheStrategy.ALL:快取SOURC和RESULT。
預設採用DiskCacheStrategy.RESULT策略,對於download only操作要使用DiskCacheStrategy.SOURCE。

4、priority(Priority priority)

指定載入的優先順序,優先順序越高越優先載入,但不保證所有圖片都按序載入。
列舉  Priority.IMMEDIATE,Priority.HIGH,Priority.NORMAL,Priority.LOW。預設為Priority.NORMAL。

5、 dontAnimate(). 移除所有的動畫。

6、 animate(int animationId)

 在非同步載入資源完成時會執行該動畫。

7、 animate(ViewPropertyAnimation.Animator animator). 

在非同步載入資源完成時會執行該動畫。

8、 placeholder(int resourceId)

 設定資源載入過程中的佔位Drawable。

9、 placeholder(Drawable drawable)

 設定資源載入過程中的佔位Drawable。

10、fallback(int resourceId)

 設定model為空時要顯示的Drawable。如果沒設定fallback,model為空時將顯示error的Drawable,如果error的Drawable也沒設定,就顯示placeholder的Drawable。

11、 fallback(Drawable drawable)

設定model為空時顯示的Drawable。

12、error(int resourceId)

設定load失敗時顯示的Drawable。

13、error(Drawable drawable)

設定load失敗時顯示的Drawable。

14、listener(RequestListener<? super ModelType, TranscodeType> requestListener)

監聽資源載入的請求狀態,可以使用兩個回撥:

onResourceReady(R resource, T model, Target<R> target, boolean isFromMemoryCache, boolean isFirstResource)onException(Exception e, T model, Target&lt;R&gt; target, boolean isFirstResource),

但不要每次請求都使用新的監聽器,要避免不必要的記憶體申請,可以使用單例進行統一的異常監聽和處理。

15、skipMemoryCache(boolean skip)

 設定是否跳過記憶體快取,但不保證一定不被快取(比如請求已經在載入資源且沒設定跳過記憶體快取,這個資源就會被快取在記憶體中)。

16、 override(int width, int height)

重新設定Target的寬高值(單位為pixel)。

17、into(Y target)

設定資源將被載入到的Target。

18、into(ImageView view)

 設定資源將被載入到的ImageView。取消該ImageView之前所有的載入並釋放資源。

19、into(int width, int height)

 後臺執行緒載入時要載入資源的寬高值(單位為pixel)。

20、 preload(int width, int height). 預載入resource到快取中(單位為pixel)。

21、 asBitmap()

 無論資源是不是gif動畫,都作為Bitmap對待。如果是gif動畫會停在第一幀。
 注意:先load()asBitmap(),不然報錯!(與Glide4有區別)

22、asGif()

把資源作為GifDrawable對待。如果資源不是gif動畫將會失敗,會回撥.error()。

23、dontTransform()

表示讓Glide在載入圖片的過程中不進行圖片變換,這樣applyCenterCrop()applyFitCenter()就統統無效了,顯示原圖大小

24、downloadOnly()直接下載

清空快取

禁止記憶體快取:

.skipMemoryCache(true)

清除記憶體快取:

// 必須在UI執行緒中呼叫
Glide.get(context).clearMemory();

禁止磁碟快取:

.diskCacheStrategy(DiskCacheStrategy.NONE)

清除磁碟快取:

// 必須在後臺執行緒中呼叫,建議同時clearMemory()
Glide.get(applicationContext).clearDiskCache();

直接獲得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();

該方式只能在子執行緒中獲得

下載圖片到本地

  • 使用downloadOnly下載
new Thread(new Runnable() {
            @Override
            public void run() {
                FutureTarget<File> fileFutureTarget = Glide.with(UIUtils.getContext())
                        .load(url)
                        .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
                try {
                    final File file = fileFutureTarget.get();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mPath.setText(file.getPath());
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
        }).start();

get()方法會造成執行緒阻塞,要放在子執行緒

  • 獲得bitmap物件

 new Thread(new Runnable() {

            private Bitmap bitmap;

            @Override
            public void run() {
                try {
                    bitmap = Glide.with(UIUtils.getContext())
                            .load(url)
                            .asBitmap()
                            .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                            .get();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mIv.setImageBitmap(bitmap);
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
        }).start();

載入圖片到Notification中

NotificationTarget notificationTarget =
new NotificationTarget(
     Context,
     RemoteViews,
     viewid,
     notificationObject,
     notifyId);

Glide.with(this).load(url).asBitmap().into(notificationTarget);

Glide自帶的一個漸變動畫

Glide.with(this).load(url).crossFade([duration]).into(iv);

載入Gif

//普通顯示GIF
Glide.with( context ).load( gifUrl ).into( iv );

//新增GIF檢查,如果不是GIF就會顯示載入失敗點陣圖
Glide.with( context ).load( gifUrl ).asGif().into( iv);

顯示本地視訊

String filePath ="/storage/emulated/0/Pictures/xxx.mp4";
Glide 
    .with(context )
    .load(Uri.fromFile( new File( filePath ) ) )
    .into( iv );

Glid只能載入本地視訊,不能從網路中獲取

顯示圓形圖片

  Glide.with(this).load(R.raw.icon_added)
                .asBitmap()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .thumbnail(0.1f)
                .centerCrop()
                .into(new BitmapImageViewTarget(mIv) {
                    @Override
                    protected void setResource(Bitmap resource) {
                        RoundedBitmapDrawable circularBitmapDrawable =
                                RoundedBitmapDrawableFactory.create(MainActivity.this.getResources(),
                                        resource);
                        circularBitmapDrawable.setCircular(true);
                        mIv.setImageDrawable(circularBitmapDrawable);
                    }
                });

設定縮放方式


1: CenterCrop()是一個裁剪技術,即縮放影象讓它填充到 ImageView 界限內並且裁剪額外的部分。ImageView 可能會完全填充,但影象可能不會完整顯示。

2: fitCenter() 是裁剪技術,即縮放影象讓影象都測量出來等於或小於 ImageView 的邊界範圍。該影象將會完全顯示,但可能不會填滿整個 ImageView。

獲取快取大小:

new GetDiskCacheSizeTask(mTv)
    .execute(new File(getCacheDir(), 
    DiskCache.Factory.DEFAULT_DISK_CACHE_DIR));
 static 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 = 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(R.raw.icon_added)
        .priority(Priority.HIGH)
        .into(mTv1);
    //後加載
    Glide
        .with(context)
        .load(R.raw.icon_added)
        .priority(Priority.LOW)
        .into(mTv2);

先顯示縮圖,再顯示原圖:

 //用原圖的1/10作為縮圖
    Glide
        .with(this)
        .load("http://xxx.png")
        .thumbnail(0.1f)
        .into(iv_0);
    //用其它圖片作為縮圖
    DrawableRequestBuilder<Integer> thumbnailRequest = Glide
        .with(this)
        .load(R.drawable.ic_logo);
    Glide.with(this)
        .load("http://xxx.png")
        .thumbnail(thumbnailRequest)
        .into(mIv);

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

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

   compile 'jp.wasabeef:glide-transformations:2.0.1'

注意transformations最新版本為3.0.1 ,使用的Glide為4.0,下面的方法被去除了,暫時還不知道怎麼實現毛玻璃效果,有知道的小夥伴,可以留言,謝謝!

毛玻璃效果實現:

Glide.with(this).load(R.mipmap.bg).bitmapTransform(new BlurTransformation(this, 100))
                .into(new SimpleTarget<GlideDrawable>() {
                    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                    @Override
                    public void onResourceReady(GlideDrawable resource, GlideAnimation<? super
                            GlideDrawable> glideAnimation) {
                        mIv.setBackground(resource);
                    }
                });

提醒:儘量使用淺顏色的圖片,深顏色就成了一片黑的了!

同時這個類主要就是裁剪圖片的,這裡我寫了一個圓角的方法可用

   public static ImageView displayCircle(Context context, ImageView img, String url) {
        Glide.with(context)
                .load(url)
                .placeholder(R.drawable.app_loading_pic_round) //載入中的圖片
                .error(R.drawable.app_loading_pic_round) //載入失敗的圖片
                .override(150, 150)
                .bitmapTransform(new CropCircleTransformation(context))
                .into(img);
        return img;
    }

相關推薦

整理Glide方法使用含義毛玻璃效果實現圓角

現在專案中一般使用Glide進行圖片載入,於是找一下他的各個方法的使用,方便使用而已。 新增依賴: compile 'com.github.bumptech.glide:glide:3.7.0' 基本使用: Glide .with(

TCP連線擁塞控制四種方法總結詳細簡單穩的一批

擁塞控制的一般原理 在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的效能就要變換,叫做擁塞 擁塞控制和流量控制的區別: 擁塞控制往往是一種全域性的,防止過多的資料注入到網路之中,而TCP連線的端點只要不能收到對方的確認資訊,猜想在網路中發生了擁塞,但並不知道發生

濾鏡CIFilter簡單處理模糊效果舊色調處理

簡單建立CIFilter  沒有專業處理, 僅能達到簡單的模糊效果,效果如圖 (1)原圖 (2)舊色調處理效果 (3)模糊處理 簡單的程式碼結果如下 // //  ViewController.m //  濾鏡 // 本文檢視部落格地址http://blog

drawBitmap 適配多解析度追求效果做多圖

Rect src = new Rect(x1, y2, cx1,cy1);Rect dst = new Rect(x2, y2, cx2, cy2);canvas.drawBitmap(mBitmap, src, dst, null); 第一個矩形,是你想擷取的bit

MFC如何拷貝資源對話方塊工具欄

 MFC的資源機制是兩個檔案的配合,xxx.rc(xxx為專案名稱)檔案和resource.h檔案的配合,res.rc以指令碼的形式描述了資源的形式,如***對話方塊大小,ID,有什麼按鈕,按鈕的ID等等 如“關於”對話方塊在rc檔案內的描述(怎麼開啟,找到rc檔案,資源管

全面屏適配小米8三星s8

引入問題: 使用者提出自己的小米8手機執行app時候底部有黑邊,因為是內部系統不方便截圖,我這裡就從miui裡找了一個圖來代替 開始還擔心是螢幕適配的問題(dimens適配),但是系統中只適配橫向,縱向不做適配; 下次發版前給使用者的臨時處理方案: 設定-全面屏-應用全面屏執行設定

對PPT的操作文字替換圖片插入

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using POWER

樹梅派Ubuntu mate 16.04 首次安裝配置中文輸入法顯示配置

1.樹梅派開機自動登入配置 我們希望能在跳過登陸介面,自動登陸後直接啟動程式,可以進行一下配置。 sudo vim /etc/lightdm/lightdm.conf 如果沒有v

使用ADO GetChunk/AppendChunk 資料庫存取二進位制檔案如程式圖象

 在設計資料庫的過程中,我們會經常要儲存一些圖形、長文字、多媒體(視訊、音訊檔案)等各種各樣的程式檔案,如果我們在資料庫中僅儲存這些檔案的路徑資訊,儘管這可以大大地減小資料庫的大小,但是由於檔案存在磁碟上,我們除了維護資料庫外還要維護檔案的路徑資訊,保持二者的一致,這對於我們

CentOS 掛載硬件設備U盤硬盤

epel etc usb umount fdisk命令 asn shm fix 不用 1、掛載fat或者fat32分區的U盤 如果是用VM安裝的linux,在vm裏掛載U盤有兩個前提: 第一,主機裏的service要啟動: 第二,U盤是連接到虛擬機,而不是主機,需要確認這

sqlitesql替換特殊字元換行tab鍵

換tab  sql語句: UPDATE table_name SET field_name=REPLACE(field_name,char(09),'') 但是 sqlite會報錯 在sqlite中 換tab 為x'09'所以sql為:  update  question_

VS2010利用巨集快速添加註釋函式描述修改註釋

在敲程式碼的過程中類和函式都需要進行註釋,但總是一遍一遍的複製貼上覺得很是麻煩,終於找到了一個不錯的解決方法:使用巨集。     所謂巨集,就是一些命令組織在一起,作為一個單獨命令完成一個特定任務。在日常的辦公環境中,不論是Office還是Foxmail以及我們所使用的

Android Studio主題設定介面背景字型顏色

話不多說直接上鍊接吧~ http://color-themes.com/?view=index 下載想要的主題,開啟AS → File → Import Settings 然後重啟。如果想換就在Se

scrapy的一些容易忽視的點模擬登陸傳遞item

信息 pan pytho 完成 xtra author back book 多少 scrapy爬蟲註意事項 item數據只有最後一條 item字段傳遞後錯誤,混亂 對一個頁面要進行兩種或多種不同的解析 xpath中contains的使用 提取不在標簽內的文本內容 使用cs

自己實戰整理面試題--Mysql帶答案不斷更新

mysql目前用的版本? 5.1.21;目前最高5.7.* left join,right join,inner join? left join(左連線) 返回包括左表中的所有記錄和右表中連線欄位相等的記錄  right join(右連線) 返回包括右表中的所有記錄和左

自己實戰整理面試題--鎖帶答案不斷更新

java有哪些鎖? Synchronized 和 ReentrantLock? 1、synchronized是重量級鎖? 從JDK 1.5 到 JDK 1.6 有一個高效併發方面的重要改進,HotSpot虛擬機器開發團隊在這個版本中花費了很大的精力去對Java中的鎖進行優化(synchr

自己實戰整理面試題--JVM帶答案不斷更新

jvm記憶體模型,java記憶體模型,GC機制和原理; 物件是否可 GC? GC分哪兩種,Minor GC 和Full GC有什麼區別?什麼時候會觸發Full GC?分別採用什麼演算法? 垃圾回收演算法 垃圾回收器 G1 常見的JVM調優方法有哪些?可以具體到調整哪個引數,調成什麼值? JVM虛

自己實戰整理面試題--集合帶答案不斷更新

Set 和 List 區別? ArrayList 和 LinkedList 區別? 如果存取相同的資料,ArrayList 和 LinkedList 誰佔用空間更大? List 和 Map 區別,Arraylist 與 LinkedList 區別,ArrayList 與 Vector 區別? S

自己實戰整理面試題--Redis帶答案不斷更新

Redis應用場景? 分散式鎖:通過setnx/del命令來實現,不完美的是由於業務場景比較多,所以,有些瑕疵,比如:setnx/del命令是非原子性的,存在執行完setnx但是沒有執行del的情況,導致鎖無法釋放,針對這種情況Redis的團隊加入了一些引數特性,給鎖加上過期時間,我的理解時

自己實戰整理面試題--Spring帶答案不斷更新

Spring 的原理? Spring的核心主要是IOC和AOP;從Spring簡單的來說,是通過對POJO開發的支援,來具體實現的;Spring通過為應用開發提供基於POJO的開發模式,把應用開發和複雜的Java EE服務,實現解耦,並通過提高單元測試的覆蓋率,從而有效的提