Android中Glide庫(kù)的使用小技巧總結(jié)
簡(jiǎn)介
在泰國(guó)舉行的谷歌開(kāi)發(fā)者論壇上,谷歌為我們介紹了一個(gè)名叫 Glide 的圖片加載庫(kù),作者是bumptech。這個(gè)庫(kù)被廣泛的運(yùn)用在google的開(kāi)源項(xiàng)目中,包括2014年google I/O大會(huì)上發(fā)布的官方app。
https://github.com/bumptech/glide
簡(jiǎn)單使用
dependencies { compile 'com.github.bumptech.glide:glide:3.7.0' }
如何查看最新版本
http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22glide%22
詳細(xì)的Glide庫(kù)配置、使用方法及簡(jiǎn)介看這里:http://chabaoo.cn/article/83156.htm
引言
所以大家都知道,在Android項(xiàng)目中,圖片加載是必備的功課。經(jīng)歷過(guò)多個(gè)第三方圖片加載庫(kù)后,用到了Glide。感覺(jué)挺好用,記錄下使用中總結(jié)的小技巧。
- AS導(dǎo)入Glide庫(kù)
- Glide方法介紹
AS導(dǎo)入Glide庫(kù)
dependencies { compile ‘com.github.bumptech.glide:glide:3.5.2' compile ‘com.android.support:support-v4:22.0.0' }
Glide使用
在需要加載圖片的地方,直接調(diào)用方法。在with()
方法中,參數(shù)可以是activity,fragment以及context,以activity和fragment作為參數(shù)的好處在于,可以根據(jù)activity和fragment的生命周期來(lái)加載圖片。
基礎(chǔ)使用:
Glide.with(activity).load(url).into(view);
需要注意:
不要在非主線程里面使用Glide加載圖片。如果非要使用Glide在非主線程中加載圖片,那么請(qǐng)將context改成getApplicationContext
Glide擴(kuò)展屬性介紹
1、override(int width, int height)
使用此方法,自定義圖片大小
2、fitCenter()/centerCrop()/fitStart()/fitEnd()
設(shè)置imageview的setScaleType,控制Glide在加載圖片的時(shí)候,能根據(jù)imageview的尺寸或者overide()
的尺寸加載圖片。減少加載圖片OOM出現(xiàn)的可能性。
3、圖片緩存
Glide的圖片緩存策略是根據(jù)imageview尺寸進(jìn)行相應(yīng)處理,緩存與imageview尺寸相同的圖片。
使用方法:
.diskCacheStrategy(DiskCacheStrategy.RESULT)
查看源碼可得
- DiskCacheStrategy.NONE caches nothing, as discussed 不緩存圖片
- DiskCacheStrategy.SOURCE caches only the original full-resolution image. In our example above that would be the 1000x1000 pixel one 僅緩存原圖片
- DiskCacheStrategy.RESULT caches only the final image, after reducing the resolution (and possibly transformations) 緩存根據(jù)URL加載到imageview后,與imageview相同尺寸的圖片
- DiskCacheStrategy.ALL caches all versions of the image (default behavior) 默認(rèn)的緩存方式,會(huì)將URL得到的圖片各個(gè)尺寸都緩存一遍。
很明顯可知,在使用過(guò)程中,一般會(huì)考慮DiskCacheStrategy.ALL
與DiskCacheStrategy.RESULT
。其中使用ALL,會(huì)占用較多的內(nèi)存,但是同一張圖片,在不同地方顯示不同尺寸,是一次網(wǎng)絡(luò)請(qǐng)求而來(lái);而使用RESULT,則會(huì)相對(duì)少的占用內(nèi)存,但是一張圖片在不同地方顯示不同尺寸,會(huì)根據(jù)尺寸不同多次請(qǐng)求網(wǎng)絡(luò)。
4、占位圖,錯(cuò)誤圖展示
placeholder()
,默認(rèn)占位圖
error()
,默認(rèn)加載錯(cuò)誤顯示的圖片
5、使用Glide加載自定義imageview中圖片
使用Glide加載自定義view的時(shí)候,可能會(huì)出現(xiàn)如下情況:
Glide填寫(xiě)了占位圖,查看自定義View,自定義View第一次不會(huì)顯示URL加載的圖片,而是顯示占位圖。需要取消再次查看自定義View,才會(huì)顯示正確。
出現(xiàn)原因:Glide加載自定義View的時(shí)候,需要使用Glide庫(kù)中的Transformations方法轉(zhuǎn)換自定義imageview或者在into()方法中使用 new simpleTarget()
方法來(lái)處理圖片。
解決方法:
a、使用Transformations方法轉(zhuǎn)換
public class BlurTransformation extends BitmapTransformation { private RenderScript rs; public BlurTransformation(Context context) { super( context ); rs = RenderScript.create( context ); } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { Bitmap blurredBitmap = toTransform.copy( Bitmap.Config.ARGB_8888, true ); // Allocate memory for Renderscript to work with Allocation input = Allocation.createFromBitmap( rs, blurredBitmap, Allocation.MipmapControl.MIPMAP_FULL, Allocation.USAGE_SHARED ); Allocation output = Allocation.createTyped(rs, input.getType()); // Load up an instance of the specific script that we want to use. ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setInput(input); // Set the blur radius script.setRadius(10); // Start the ScriptIntrinisicBlur script.forEach(output); // Copy the output to the blurred bitmap output.copyTo(blurredBitmap); toTransform.recycle(); return blurredBitmap; } @Override public String getId() { return "blur"; } }
Glide .with( context ) .load( eatFoodyImages[0] ) .transform( new BlurTransformation( context ) ) //.bitmapTransform( new BlurTransformation( context ) ) // this would work too! .into( imageView1 );
b、使用new simpleTarget()
Glide.with(activity).load(url).into(new SimpleTarget() { @Override public void onResourceReady(GlideDrawable resource, GlideAnimation
如何修改Glide Bimmap格式
默認(rèn)Bitmap格式:
RGB_565,也可以使用RGB_8888,但是會(huì)相對(duì)耗內(nèi)存,而且這兩種格式在手機(jī)端看起來(lái),效果相差并不大。
如何修改Bitmap格式:
public class GlideConfiguration implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { // Apply options to the builder here. builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); } @Override public void registerComponents(Context context, Glide glide) { // register ModelLoaders here. } }
同時(shí)在Androidminifest.xml中,將GlideModul定義為meta-data
Glide設(shè)置圖片Tag
在使用過(guò)程中,想要給imageview設(shè)置tag,然后使用Glide加載,但是總會(huì)報(bào)錯(cuò)~如何為ImageView設(shè)置Tag呢?
方案一:使用setTag(int,object)方法設(shè)置tag,具體用法如下:
Glide.with(context).load(urls.get(i).getUrl()).fitCenter().into(imageViewHolder.image); imageViewHolder.image.setTag(R.id.image_tag, i); imageViewHolder.image.setOnClickListener(new View.OnClickListener() { @Override int position = (int) v.getTag(R.id.image_tag); Toast.makeText(context, urls.get(position).getWho(), Toast.LENGTH_SHORT).show(); } });
同時(shí)在values文件夾下新建ids.xml,添加
方案二:從Glide的3.6.0之后,新添加了全局設(shè)置的方法。具體方法如下:
先實(shí)現(xiàn)GlideMoudle接口,全局設(shè)置ViewTaget的tagId:
public class MyGlideMoudle implements GlideModule{ @Override public void applyOptions(Context context, GlideBuilder builder) { ViewTarget.setTagId(R.id.glide_tag_id); } @Override public void registerComponents(Context context, Glide glide) { } }
同樣,也需要在ids.xml下添加id
最后在AndroidManifest.xml文件里面添加
一些實(shí)用技巧
1.Glide.with(context).resumeRequests()
和 Glide.with(context).pauseRequests()
當(dāng)列表在滑動(dòng)的時(shí)候,調(diào)用pauseRequests()
取消請(qǐng)求,滑動(dòng)停止時(shí),調(diào)用resumeRequests()
恢復(fù)請(qǐng)求。這樣是不是會(huì)好些呢?
2.Glide.clear()
當(dāng)你想清除掉所有的圖片加載請(qǐng)求時(shí),這個(gè)方法可以幫助到你。
3.ListPreloader
如果你想讓列表預(yù)加載的話,不妨試一下ListPreloader這個(gè)類(lèi)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
參考鏈接
- http://www.wtoutiao.com/p/y3eaF0.html
- http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2650.html
- Android項(xiàng)目實(shí)戰(zhàn)之Glide 高斯模糊效果的實(shí)例代碼
- Android 使用Glide加載網(wǎng)絡(luò)圖片等比例縮放的實(shí)現(xiàn)方法
- Android框架學(xué)習(xí)之Volley和Glide詳解
- Android Glide 4.0+使用詳解
- Android中Glide加載到RelativeLayout背景圖方法示例
- Android中Glide獲取圖片Path、Bitmap用法詳解
- Android將Glide動(dòng)態(tài)加載不同大小的圖片切圓角與圓形的方法
- Android添加glide庫(kù)報(bào)錯(cuò)Error: Failed to resolve: com.android.support:support-annotations:26.0.2的解決
- android中Glide實(shí)現(xiàn)加載圖片保存至本地并加載回調(diào)監(jiān)聽(tīng)
- 詳解Android中Glide與CircleImageView加載圓形圖片的問(wèn)題
- Android利用Glide獲取圖片真正的寬高的實(shí)例
- Android如何使用Glide加載清晰長(zhǎng)圖
相關(guān)文章
Android開(kāi)發(fā)中CheckBox的簡(jiǎn)單用法示例
這篇文章主要介紹了Android開(kāi)發(fā)中CheckBox的簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了Android中CheckBox控件的基本功能設(shè)置與頁(yè)面布局技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07多面分析HarmonyOS與Android的特點(diǎn)
請(qǐng)教身邊的大佬們,公司的CTO、中臺(tái)部門(mén)的總監(jiān)、老東家數(shù)十年行業(yè)經(jīng)驗(yàn)的老架構(gòu)、以及在中科院讀研究生的大學(xué)老室友、技術(shù)圈的網(wǎng)友等等,他們都給出了自己獨(dú)特的看法,讓我從多方面更好的去了解到了大家對(duì)鴻蒙的認(rèn)識(shí)2021-08-08Android使用ContentProvider初始化SDK庫(kù)方案小結(jié)
這篇文章主要介紹了Android使用ContentProvider初始化SDK庫(kù)方案總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Android仿微信5實(shí)現(xiàn)滑動(dòng)導(dǎo)航條
這篇文章主要為大家詳細(xì)介紹了Android仿微信5實(shí)現(xiàn)滑動(dòng)導(dǎo)航條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Android動(dòng)態(tài)給ViewPager添加Indicator導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Android動(dòng)態(tài)給ViewPager添加Indicator導(dǎo)航的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Android自定義View實(shí)現(xiàn)廣告信息上下滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)廣告信息上下滾動(dòng)的具體代碼,感興趣的小伙伴們可以參考一下2016-05-05