Glide 使用必須知道的基礎(chǔ)屬性——Google推薦的圖片加載庫

如果本文幫助到你灭翔,本人不勝榮幸,如果浪費了你的時間辣苏,本人深感抱歉肝箱。
希望用最簡單的大白話來幫助那些像我一樣的人。如果有什么錯誤稀蟋,請一定指出煌张,以免誤導大家、也誤導我退客。
本文來自:http://www.reibang.com/users/320f9e8f7fc9/latest_articles
感謝您的關(guān)注骏融。

Glide圖片加載 已經(jīng) 是Google官方推薦使用的加載了。
如果把這個適當?shù)挠煤昧嗣瓤瘢瑫谐龊跻饬系男Ч挡#救擞H身體驗。

Gradle

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

with(context)茫藏,context的重要性

Glide.with(context)误趴;with() 方法中的context到底是哪種類型是不清楚的。有一點很重要需要記住务傲,就是傳入的context類型影響到Glide加載圖片的優(yōu)化程度凉当,Glide可以監(jiān)視activity的生命周期,在activity銷毀的時候自動取消等待中的請求售葡。但是如果你使用Application context看杭,你就失去了這種優(yōu)化效果。

scaleType的重要性

當設(shè)置為fitXY時天通,雖然ImageView顯示那么點尺寸泊窘,但是熄驼,但是Glide加載圖片時像寒,卻是以全分辨率加載的烘豹,于是加載幾張,就OOM了诺祸。
改成fitCenter或者centerCrop(試了一下fitStart携悯、fitEnd也行,總之看需求了)筷笨,就好了憔鬼,會自動緩存小圖,滾動起來也非常流暢胃夏。

可以在 Imageview加上這個:
<ImageView android:adjustViewBounds="true"/> 保持寬高比

加載圓形圖片
Glide.with(this)
     .load(url)
     .apply(RequestOptions.circleCropTransform())
     .into(imageView);
帶淡入淡出的動畫效果
Glide.with(this)
     .load(url)
     .transition(DrawableTransitionOptions.withCrossFade())
     .into(imageView);
不用 placeholder 占位符轴或,加載列表 item會亂跑

placeholder(R.mipmap.ic_launcher) 的行為是一個APP 去顯示一個占位符直到這張圖片加載處理完成。

指定加載格式

Glide 特別強大的一點就是可以顯示 GIF 圖片仰禀,但是如果你不想讓一張 GIF 圖顯示成動態(tài)圖照雁,而是顯示成靜態(tài)的。則可以指定他顯示的類型答恶。

// 在with()方法的后面加入了一個asBitmap()方法饺蚊,這個方法的意思就是說這里只允許加載靜態(tài)圖片
// 注意,順序不能錯悬嗓。with() 完 再 asBitmap() 
Glide.with(this) 
     .asBitmap() 
     .load("http://guolin.tech/test.gif") 
     .into(imageView);

也可以強制顯示成其他類型比如:

asGif()
asFile() // 文件格式污呼,用于下載
asDrawable() // Drawable格式,顯示圖片
簡單的縮略圖

.thumbnail( 0.1f )
傳了一個 0.1f 作為參數(shù)包竹,Glide 將會顯示原始圖像的10%的大小燕酷。如果原始圖像有 1000x1000 像素,那么縮略圖將會有 100x100 像素映企。
復雜的縮略圖


緩存

跳過內(nèi)存緩存

.skipMemoryCache( true )
這意味著 Glide 將不會把這張圖片放到內(nèi)存緩存中去悟狱。這里需要明白的是,這只是會影響內(nèi)存緩存堰氓!Glide 將會仍然利用磁盤緩存來避免重復的網(wǎng)絡(luò)請求挤渐。

跳過磁盤緩存

.diskCacheStrategy( DiskCacheStrategy.NONE )
這段代碼片段中將不會被保存在磁盤緩存中。然而双絮,默認的它將仍然使用內(nèi)存緩存浴麻!
方法里面參數(shù)意義:

  1. DiskCacheStrategy.NONE 什么都不緩存
  2. DiskCacheStrategy.DATA 僅僅只緩存原來的全分辨率的圖像。
  3. DiskCacheStrategy.RESOURCE 僅僅緩存最終的圖像囤攀,即软免,降低分辨率后的(或者是轉(zhuǎn)換后的)
  4. DiskCacheStrategy.ALL 緩存所有版本的圖像
  5. DiskCacheStrategy.AUTOMATIC 讓Glide根據(jù)圖片資源智能地選擇使用哪一種緩存策略(默認選項
清除緩存

Glide.get(this).clearDiskCache();不能在UI線程里跑,得另開一個線程焚挠。
Glide.get(this).clearMemory();只能在主線程里跑


得到 Bitmap
private SimpleTarget target = new SimpleTarget<Bitmap>() {
    @Override
    public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> transition) {
      imageView1.setImageBitmap( bitmap );
    }
};

private void loadImageSimpleTarget() {
    Glide
    .with( context ) // could be an issue!
    .load( eatFoodyImages[0] )
    .into( target );
}
下載圖片
public static void downloadImg(final Context context, final String url) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                FutureTarget<File> target = Glide.with(context)//
                        .asFile()//
                        .load(url)//
                        .apply(baseOptions)//
                        .submit();
                        
                // 文件的地址膏萧。注意:這個 get() 方法是同步的,所以放在子線程中        
                File file = target.get();
                
            } catch (Exception e) {
            }
        }
    }).start();
}

Gilde 截取視頻某一秒

Gilde 截取視頻指定時間的屏幕,這的時間千萬千萬要注意榛泛,單位是 微秒r蝓濉!曹锨!

/**
 * 顯示視頻 第三秒 那一幀
 *
 * @param context
 * @param uri
 * @param imageView
 * @param frameTimeMicros 要截取得時間孤个。單位:微秒
 */
public static void loadVideoScreenshot(final Context context, String uri, ImageView imageView, long frameTimeMicros) {
    // 這里的時間是以微秒為單位
    RequestOptions requestOptions = RequestOptions.frameOf(frameTimeMicros);
    requestOptions.set(FRAME_OPTION, MediaMetadataRetriever.OPTION_CLOSEST);
    requestOptions.transform(new BitmapTransformation() {
        @Override
        protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
            return toTransform;
        }

        @Override
        public void updateDiskCacheKey(MessageDigest messageDigest) {
            try {
                messageDigest.update((context.getPackageName() + "RotateTransform").getBytes("utf-8"));
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });
    Glide.with(context).load(uri).apply(requestOptions).into(imageView);
}

如果不用 Gilde ,也可以直接截取視頻指定時間沛简,代碼如下:

/**
 * 獲得視頻某一幀的縮略圖
 *
 * @param videoPath 視頻地址
 * @param timeUs 微秒齐鲤,注意這里是微秒 1秒 = 1 * 1000 * 1000 微秒
 *
 * @return 截取的圖片
 */
public static Bitmap getVideoThumnail(String videoPath, long timeUs) {
    MediaMetadataRetriever media = new MediaMetadataRetriever();
    media.setDataSource(videoPath);
    // 獲取第一個關(guān)鍵幀
    // OPTION_CLOSEST 在給定的時間,檢索最近一個幀椒楣,這個幀不一定是關(guān)鍵幀给郊。
    // OPTION_CLOSEST_SYNC 在給定的時間,檢索最近一個關(guān)鍵幀捧灰。
    // OPTION_NEXT_SYNC 在給定時間之后丑罪,檢索一個關(guān)鍵幀。
    // OPTION_PREVIOUS_SYNC 在給定時間之前凤壁,檢索一個關(guān)鍵幀吩屹。
    return media.getFrameAtTime(timeUs, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);

    // 得到視頻第一幀的縮略圖
    // return media.getFrameAtTime();
}

以上是我自己選出的一些覺得經(jīng)常用到的,還會更新拧抖。

想要看更詳細的 Glide 介紹可以看看這里:
http://blog.csdn.net/guolin_blog/article/details/78582548


Android關(guān)于圖片內(nèi)存計算

Android中有四種煤搜,分別是:
ALPHA_8:每個像素占用1byte內(nèi)存
ARGB_4444:每個像素占用2byte內(nèi)存
ARGB_8888:每個像素占用4byte內(nèi)存
RGB_565:每個像素占用2byte內(nèi)存
Android默認的顏色模式為ARGB_8888,這個顏色模式色彩最細膩唧席,顯示質(zhì)量最高擦盾。但同樣的,占用的內(nèi)存也最大淌哟。

舉例說明一個32位的PNG也就是ARGB_8888,像素是1204x1024,那么占用空間是:
1024x1024x(32/8) = 4,194,304迹卢,也就是4M多。

因為8bit = 1 byte, 32位就是4byte. 我們在解析圖片的時候為了方式oom最好使用ARGB_4444模式. 節(jié)省一半的內(nèi)存空間.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徒仓,一起剝皮案震驚了整個濱河市腐碱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掉弛,老刑警劉巖症见,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異殃饿,居然都是意外死亡谋作,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門乎芳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遵蚜,“玉大人帖池,你說我怎么就攤上這事】跃唬” “怎么了碘裕?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長攒钳。 經(jīng)常有香客問我,道長雷滋,這世上最難降的妖魔是什么不撑? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮晤斩,結(jié)果婚禮上焕檬,老公的妹妹穿的比我還像新娘。我一直安慰自己澳泵,他們只是感情好实愚,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兔辅,像睡著了一般腊敲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上维苔,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天碰辅,我揣著相機與錄音,去河邊找鬼介时。 笑死没宾,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的沸柔。 我是一名探鬼主播循衰,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼褐澎!你這毒婦竟也來了会钝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤工三,失蹤者是張志新(化名)和其女友劉穎顽素,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徒蟆,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡胁出,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了段审。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片全蝶。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抑淫,到底是詐尸還是另有隱情绷落,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布始苇,位于F島的核電站砌烁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏催式。R本人自食惡果不足惜函喉,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荣月。 院中可真熱鬧管呵,春花似錦、人聲如沸哺窄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萌业。三九已至坷襟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間生年,已是汗流浹背啤握。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晶框,地道東北人排抬。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像授段,于是被迫代替她去往敵國和親蹲蒲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容