Glide v4版本用法探究.md

一基本介紹

  1. 本博客是基於Glide4.0+進行探究和學習
  2. 使用配置
  3. 用法比對

二使用配置

1. Android studio 使用項目gradle配置

dependencies {
    //glide
    compile 'com.github.bumptech.glide:glide:4.6.1'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'
}

2. 配置要求和可能出現的錯誤

Glide4.0要求使用sdk api級別爲 27,所以需要將項目的sdk爲27,如果配置後還是報java.lang.NoSuchMethodError: No static method這個錯誤,你再檢查下你的v4和v7包,這個依賴也要升到27,下面貼出我的配置

com.android.support:appcompat-v7:27.0.2'

3. 當然因爲glide的特性,你也應該再權限請求裏面添加相關權限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

三基本使用方法

1. 多數情況情況下,一行代碼足以搞定;

Glide.with(fragment)
    .load(myUrl)
    .into(imageView);

2. 使用 Generated API教程 https://github.com/13767004362/GlideDemo

3. 各種使用方法的介紹

幾種佔位符

  • placeholder 表示預先佔位符
  • error 錯誤圖
  • fallback 後背回調符 在請求的url/model爲 null 時展示。設計 fallback Drawable 的主要目的是允許用戶指示 null 是否爲可接受的正常情況

加載方式

  • CenterCrop 縮放寬和高都到達View的邊界,有一個參數在邊界上,另一個參數可能在邊界上,也可能超過邊界
  • CenterInside 如果寬和高都在View的邊界內,那就不縮放,否則縮放寬和高都進入View的邊界,有一個參數在邊界上,另一個參數可能在邊界上,也可能在邊界內
  • CircleCrop 圓形且結合了CenterCrop的特性
  • FitCenter 縮放寬和高都進入View的邊界,有一個參數在邊界上,另一個參數可能在邊界上,也可能在邊界內
  • RoundedCorners 圓角
  • thumbnail 縮略圖加載

4. 多重變換

這裏指的是比如我們獲得的是一張灰色的正方形圖片,當是我們最後需要顯示的是圓角紅色圖片,這個時候就可以進行多重變換,這裏就需要用到 transform這個方法,現將圖片變成圓的,再將圖片背景變成紅色,Glide給我們提供了圓形圖片的方法 new CircleCrop(),這裏推薦一個glide自定義庫,基本上大部分的變化已經幫我們實現了 https://github.com/wasabeef/glide-transformations

 GlideApp.with(activity)
                .load("https://img3.doubanio.com/lpic/s23119932.jpg")
                .transform(new MultiTransformation<Bitmap>(new FitCenter(),new CircleCrop(),new CenterInside())) //我們可以自定義變化
                .placeholder(R.drawable.ic_launcher_background)
                .into(image_3);

5. 動畫添加

在v4當中,它的動畫是和你要加載的資源類型決定的,所以如果是bitmap就用

  1. GenericTransitionOptions 貌似是通用文件
  2. DrawableTransitionOptions 針對drawable類型文件
  3. BitmapTransitionOptions 針對bitmap類型文件
GlideApp.with(activity)
        .load("https://img3.doubanio.com/lpic/s23119932.jpg")
        .placeholder(R.drawable.ic_launcher_background)
        .transition(DrawableTransitionOptions.withCrossFade()) //加載系統的動畫
        .into(image_4);
GlideApp.with(activity)
        .load("https://img3.doubanio.com/lpic/s23119932.jpg")
        .placeholder(R.drawable.ic_launcher_background)
        .transition(GenericTransitionOptions.with(android.R.anim.slide_in_left)) //加載anim動畫
        .into(image_5);

6. 從內存中加載也使用動畫

Glide的默認時從內存中不使用動畫的,這個問題可以通過添加new RequestListener監聽實現它的onResourceready()這個方法去實現

RequestBuilder<Drawable> requestBuilder = Glide.with(activity)
        .load("https://img3.doubanio.com/lpic/s23119932.jpg");
requestBuilder
        .listener(new RequestListener<Drawable>() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                return false;
            }

            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                //如果是從緩存加載,設置動畫效果
                image_1.startAnimation(AnimationUtils.loadAnimation(activity, android.R.anim.slide_in_left));
                Log.d("onResourceReady", "in put " + isFirstResource);
                return false;
            }
        })
        .transition(GenericTransitionOptions.with(android.R.anim.slide_in_left))
        .into(image_1);

然後這裏有個小tips需要注意: 關於動畫只加載一次的問題,要使用startAnimation啓動動畫而不是setAnimation;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章