一基本介紹
- 本博客是基於Glide4.0+進行探究和學習
- 使用配置
- 用法比對
二使用配置
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就用
- GenericTransitionOptions 貌似是通用文件
- DrawableTransitionOptions 針對drawable類型文件
- 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;