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

若是本文幫助到你,本人不勝榮幸,若是浪費了你的時間,本人深感抱歉。 但願用最簡單的大白話來幫助那些像我同樣的人。若是有什麼錯誤,請必定指出,以避免誤導你們、也誤導我。 本文來自:www.jianshu.com/users/320f9… 感謝您的關注。git

Glide圖片加載 已經 是Google官方推薦使用的加載了。 若是把這個適當的用好了,會有出乎意料的效果,本人親身體驗。github

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加上這個: 保持寬高比app

加載圓形圖片
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 去顯示一個佔位符直到這張圖片加載處理完成。ide

指定加載格式

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 像素。 複雜的縮略圖this


###緩存url

跳過內存緩存

.skipMemoryCache( true ) 這意味着 Glide 將不會把這張圖片放到內存緩存中去。這裏須要明白的是,這只是會影響內存緩存!Glide 將會仍然利用磁盤緩存來避免重複的網絡請求。

跳過磁盤緩存

.diskCacheStrategy( DiskCacheStrategy.NONE ) 這段代碼片斷中將不會被保存在磁盤緩存中。然而,默認的它將仍然使用內存緩存! 方法裏面參數意義:

  1. DiskCacheStrategy.NONE 什麼都不緩存
  2. DiskCacheStrategy.DATA 僅僅只緩存原來的全分辨率的圖像。
  3. DiskCacheStrategy.RESOURCE 僅僅緩存最終的圖像,即,下降分辨率後的(或者是轉換後的)
  4. DiskCacheStrategy.ALL 緩存全部版本的圖像
  5. 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模式. 節省一半的內存空間.

相關文章
相關標籤/搜索