如果本文幫助到你,本人不勝榮幸,如果浪費了你的時間,本人深感抱歉。 希望用最簡單的大白話來幫助那些像我一樣的人。如果有什麼錯誤,請一定指出,以免誤導大家、也誤導我。 本文來自:www.jianshu.com/users/320f9… 感謝您的關注。
Glide圖片載入 已經 是Google官方推薦使用的載入了。 如果把這個適當的用好了,會有出乎意料的效果,本人親身體驗。
Gradle
compile 'com.github.bumptech.glide:glide:4.4.0'
複製程式碼
with(context),context的重要性
Glide.with(context);with() 方法中的context到底是哪種型別是不清楚的。有一點很重要需要記住,就是傳入的context型別影響到Glide載入圖片的優化程度,Glide可以監視activity的生命週期,在activity銷燬的時候自動取消等待中的請求。但是如果你使用Application context,你就失去了這種優化效果。
scaleType的重要性
當設定為fitXY時,雖然ImageView顯示那麼點尺寸,但是,但是Glide載入圖片時,卻是以全解析度載入的,於是載入幾張,就OOM了。 改成fitCenter或者centerCrop(試了一下fitStart、fitEnd也行,總之看需求了),就好了,會自動快取小圖,滾動起來也非常流暢。
可以在 Imageview加上這個: 保持寬高比
載入圓形圖片
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 圖顯示成動態圖,而是顯示成靜態的。則可以指定他顯示的型別。
// 在with()方法的後面加入了一個asBitmap()方法,這個方法的意思就是說這裡只允許載入靜態圖片
// 注意,順序不能錯。with() 完 再 asBitmap()
Glide.with(this)
.asBitmap()
.load("http://guolin.tech/test.gif")
.into(imageView);
複製程式碼
也可以強制顯示成其他型別比如:
asGif()
asFile() // 檔案格式,用於下載
asDrawable() // Drawable格式,顯示圖片
複製程式碼
簡單的縮圖
.thumbnail( 0.1f ) 傳了一個 0.1f 作為引數,Glide 將會顯示原始影象的10%的大小。如果原始影象有 1000x1000 畫素,那麼縮圖將會有 100x100 畫素。 複雜的縮圖
###快取
跳過記憶體快取
.skipMemoryCache( true ) 這意味著 Glide 將不會把這張圖片放到記憶體快取中去。這裡需要明白的是,這只是會影響記憶體快取!Glide 將會仍然利用磁碟快取來避免重複的網路請求。
跳過磁碟快取
.diskCacheStrategy( DiskCacheStrategy.NONE ) 這段程式碼片段中將不會被儲存在磁碟快取中。然而,預設的它將仍然使用記憶體快取! 方法裡面引數意義:
- DiskCacheStrategy.NONE 什麼都不快取
- DiskCacheStrategy.DATA 僅僅只快取原來的全解析度的影象。
- DiskCacheStrategy.RESOURCE 僅僅快取最終的影象,即,降低解析度後的(或者是轉換後的)
- DiskCacheStrategy.ALL 快取所有版本的影象
- DiskCacheStrategy.AUTOMATIC 讓Glide根據圖片資源智慧地選擇使用哪一種快取策略(預設選項)
清除快取
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 擷取視訊指定時間的螢幕,這的時間千萬千萬要注意,單位是 微秒!!!
/**
* 顯示視訊 第三秒 那一幀
*
* @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);
// 獲取第一個關鍵幀
// OPTION_CLOSEST 在給定的時間,檢索最近一個幀,這個幀不一定是關鍵幀。
// OPTION_CLOSEST_SYNC 在給定的時間,檢索最近一個關鍵幀。
// OPTION_NEXT_SYNC 在給定時間之後,檢索一個關鍵幀。
// OPTION_PREVIOUS_SYNC 在給定時間之前,檢索一個關鍵幀。
return media.getFrameAtTime(timeUs, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
// 得到視訊第一幀的縮圖
// return media.getFrameAtTime();
}
複製程式碼
以上是我自己選出的一些覺得經常用到的,還會更新。
想要看更詳細的 Glide 介紹可以看看這裡: blog.csdn.net/guolin_blog…
Android關於圖片記憶體計算
Android中有四種,分別是: ALPHA_8:每個畫素佔用1byte記憶體 ARGB_4444:每個畫素佔用2byte記憶體 ARGB_8888:每個畫素佔用4byte記憶體 RGB_565:每個畫素佔用2byte記憶體 Android預設的顏色模式為ARGB_8888,這個顏色模式色彩最細膩,顯示質量最高。但同樣的,佔用的記憶體也最大。
舉例說明一個32位的PNG也就是ARGB_8888,畫素是1204x1024,那麼佔用空間是: 1024x1024x(32/8) = 4,194,304,也就是4M多。
因為8bit = 1 byte, 32位就是4byte. 我們在解析圖片的時候為了方式oom最好使用ARGB_4444模式. 節省一半的記憶體空間.