android 图片加载库 Glide 的使用介绍
在泰國(guó)舉行的谷歌開發(fā)者論壇上,谷歌為我們介紹了一個(gè)名叫?Glide?的圖片加載庫(kù),作者是bumptech。這個(gè)庫(kù)被廣泛的運(yùn)用在google的開源項(xiàng)目中,包括2014年google I/O大會(huì)上發(fā)布的官方app。
?https://github.com/bumptech/glide
二:使用??
dependencies { compile 'com.github.bumptech.glide:glide:3.7.0' }如何查看最新版本
? http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22glide%22
?
三:使用方法及簡(jiǎn)介
? ? ?http://mrfu.me/2016/02/27/Glide_Getting_Started/
?
四、清除緩存? ?
/*** 清除緩存* @param context*/public void clearCache( final Context context ){clearMemoryCache( context );new Thread(new Runnable() {@Overridepublic void run() {clearDiskCache( context );}}).start();}/*** 清除內(nèi)存緩存* @param context*/public void clearMemoryCache( Context context ){Glide.get( context ).clearMemory();}/*** 清除磁盤緩存* @param context*/public void clearDiskCache( Context context ){Glide.get( context ).clearDiskCache();}五、注意事項(xiàng)
? ? 5.1、在使用時(shí)需要給app添加聯(lián)網(wǎng)權(quán)限,沒有權(quán)限不會(huì)報(bào)錯(cuò),但是圖片加載不出來(lái),很坑爹。
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />? ?5.2、加載圖片的方法要寫在 UI 線程中,Glide會(huì)做異步處理。
?
六、使用方法總結(jié)
? ? ?6.1 加載網(wǎng)絡(luò)圖片? ?
imageView = (ImageView) findViewById( R.id.image ); String url = "http://img5.jpg" ; Glide.with( this ).load( url ).into( imageView ) ;6.2 加載網(wǎng)絡(luò)圖片監(jiān)聽(下載完成后顯示)
package lib.com.myapplication; import android.graphics.Bitmap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget;public class MainActivity extends AppCompatActivity {private ImageView imageView ;String url = "http://img5.imgtn.bdimg.com/it/u=2941079711,2736454066&fm=11&gp=0.jpg" ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = (ImageView) findViewById( R.id.image );Glide.with( this ).load( url ).asBitmap().into( target ) ;}private SimpleTarget target = new SimpleTarget<Bitmap>() {@Overridepublic void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {//圖片加載完成imageView.setImageBitmap(bitmap);}}; }特別注意 :.asBitmap() 一定要加,否則可能會(huì)出錯(cuò)
? ? ?6.3?占位符?placeholder()?方法:在加載開始 -- 加載完成,這段時(shí)間顯示的圖片。如果加載失敗,則最終顯示占位符。
imageView = (ImageView) findViewById( R.id.image ); Glide.with( this ).load( url ).placeholder( R.drawable.user ).into( imageView ) ;? ? ?6.4 占位符 error() 方法:在加載失敗的情況下,顯示的圖片。
imageView = (ImageView) findViewById( R.id.image );Glide.with( this ).load( url ).placeholder( R.drawable.user ).error( R.drawable.default_error ).into( imageView ) ;? ? ?在加載開始--> 加載完成(失敗),顯示placeholder()圖片; 如果加載失敗,則顯示error() 里面的圖片。
? ? ?6.5 加載 drawable 里面的圖片
imageView = (ImageView) findViewById( R.id.image );Glide.with( this ).load( R.drawable.icon ).asBitmap().into( imageView ) ;? ? ?6.6 加載 SD 卡里面的一張圖片 1 load( String string)
imageView = (ImageView) findViewById( R.id.image );//sd卡上的一張圖片String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/temp.jpg" ;Glide.with( this ).load( path ).into( imageView ) ;? ? ?6.7 加載 SD 卡里面的一張圖片 2 load( File file )
imageView = (ImageView) findViewById( R.id.image );//sd卡上的一張圖片 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/temp.jpg" ; File file = new File( path ) ; Glide.with( this ).load( file ).into( imageView ) ;?? ? ?6.8 加載 SD 卡里面的一張圖片 3 ?load( Uri ?uri )
//sd卡上的一張圖片 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/temp.jpg" ; File file = new File( path ) ; Uri uri = Uri.fromFile( file ) ; Glide.with( this ).load( uri ).into( imageView ) ;? ? ? ?6.9 ??Glide.with() 生命周期控制
- 請(qǐng)求會(huì)在onStop的時(shí)候自動(dòng)暫停,
- 在onStart的時(shí)候重新啟動(dòng),gif的動(dòng)畫也會(huì)在onStop的時(shí)候停止,以免在后臺(tái)消耗電量。
?
? ? ? ?6.10 ?加載優(yōu)先級(jí)設(shè)置? ? ?priority()
? ? ? ? 枚舉類?Priority 提供了幾種優(yōu)先級(jí)等級(jí) ?,
? ? ??
? ? ? 默認(rèn)的是 : NORMAL
? ?
? ? ? ?實(shí)例:
Glide.with( this).load( url2).priority(Priority.LOW ).into( imageView2 ) ;Glide.with( this).load( url3).priority(Priority.HIGH ).into( imageView3 ) ;? ?但是這里的優(yōu)先級(jí)只是在加載的過(guò)程中起一個(gè)參考作用, 并不決定真正的加載順序。
?
? ? ?6.11 縮略圖的支持? ? ??
? ?(一)?先加載原圖的十分之一作為縮略圖,再加載原圖
Glide.with( thi ).load( url ).thumbnail(0.1f).into( imageview ) ;(二)用本地的圖片作為縮略圖,然后再加載原圖
DrawableRequestBuilder<Integer> thumbnailRequest = Glide.with( ThumbnailActivity.this ).load(R.mipmap.ic_launcher);Glide.with( ThumbnailActivity.this ).load( ur2 ).thumbnail( thumbnailRequest ).into( imageView2 ) ;
? ? ?6.12 加載 Gif 動(dòng)圖
Glide.with( this ).load( url ).into( imageView1 ) ; Glide.with( this ).load( url ).asGif().into( imageView2 ) ;注意:如果把a(bǔ)sGif 換成 asBitmap 則會(huì)顯示一張靜態(tài)圖。
?
? ? ?6.13 加載本地視頻,相當(dāng)于一張縮略圖
imageView = (ImageView) findViewById( R.id.image_video ); String files = Environment.getExternalStorageDirectory().getAbsolutePath() + "/yueyu.mkv" ; Glide.with( this ).load( files ).into( imageView ) ;(1)只能加載本地視頻,網(wǎng)絡(luò)視頻無(wú)法加載。
? ? ? (2)加載本地視頻顯示只是視頻的第一幀圖像,相當(dāng)于一張縮略圖。不能播放視頻。
?
? ? ?6.14 加載動(dòng)畫
- .crossFade() ?淡入淡出 , 也是默認(rèn)動(dòng)畫
- .crossFade( int duration ) ?定義淡入淡出的時(shí)間間隔
- .dontAnimate() ? 不使用任何動(dòng)畫? ? ? ?
?
? ? 6.15 ?glide 內(nèi)存緩存
? ? ?glide 默認(rèn)啟用內(nèi)存緩存,如果想要禁止內(nèi)存緩存 ,使用?.skipMemoryCache( true )
? ??
七、自定義?GlideModule
? ? ? ? ?自定義 GlideModule 的好處:
? ? ? ? ? ? ? 1、可以全局的改變 glide 的加載策略
? ? ? ? ? ? ? 2、可以自定義磁盤緩存目錄
? ? ? ? ? ? ? 3、可以設(shè)置圖片加載的質(zhì)量
? ? ? ?7.1 首先定義一個(gè)類實(shí)現(xiàn)?GlideModule? ? ?
public class SimpleGlideModule implements GlideModule {@Overridepublic void applyOptions(Context context, GlideBuilder builder) {}@Overridepublic void registerComponents(Context context, Glide glide) {} }可以看到重寫了兩個(gè)方法,applyOptions() , registerComponents() . 兩個(gè)方法都沒有返回值 。我們著重于第一個(gè)方法,重點(diǎn)研究 GlideBuilder 。
? ? ?
? ? ?7.2 然后在?AndroidManifest.xml 去申明你寫的?SimpleGlideModule?
<meta-dataandroid:name="app.zuil.com.glidedemo.util.SimpleGlideModule"android:value="GlideModule" />name是:包名 + 類名?
?
? ? 7.3?GlideBuilder??
- .setMemoryCache(MemoryCache memoryCache)
- .setBitmapPool(BitmapPool bitmapPool)
- .setDiskCache(DiskCache.Factory diskCacheFactory)
- .setDiskCacheService(ExecutorService service)
- .setResizeService(ExecutorService service)
- .setDecodeFormat(DecodeFormat decodeFormat)
? ? ? ? ? 可以看到 setBitmapPool() 是設(shè)置bitmap池的 ; setDecodeFormat() 是設(shè)置解碼方式的 ?; ? setDiskCache() 是設(shè)置磁盤緩存的 ;?
? ? ?7.4 DecodeFormat ?
? ? ? ? ?Android里有兩個(gè)方法去解析圖片:ARGB8888和RGB565。第一個(gè)為每個(gè)像素采用4 byte表示,后面一個(gè)則用2 byte表示。ARG8888有更高的圖片質(zhì)量,并且能夠存儲(chǔ)一個(gè)alpha通道。Glide默認(rèn)使用低質(zhì)量的RGB565。你可以通過(guò)使用Glide module方法改變解析格式。
? ? ? ? ? ?
? ? ? ? ?最后一個(gè)完整的自定義glideModule
public class SimpleGlideModule implements GlideModule {@Overridepublic void applyOptions(Context context, GlideBuilder builder) {//定義緩存大小為100Mint diskCacheSize = 100 * 1024 * 1024;//自定義緩存 路徑 和 緩存大小String diskCachePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/glideCache" ;//提高圖片質(zhì)量builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);//自定義磁盤緩存:這種緩存只有自己的app才能訪問(wèn)到// builder.setDiskCache( new InternalCacheDiskCacheFactory( context , diskCacheSize )) ;// builder.setDiskCache( new InternalCacheDiskCacheFactory( context , diskCachePath , diskCacheSize )) ;//自定義磁盤緩存:這種緩存存在SD卡上,所有的應(yīng)用都可以訪問(wèn)到builder.setDiskCache(new DiskLruCacheFactory( diskCachePath , diskCacheSize ));}@Overridepublic void registerComponents(Context context, Glide glide) {} }
八、緩存管理
? ? ? ?7.1、默認(rèn)緩存目錄和緩存大小
? ? ? ? ? ? ? ?在Glide源碼中有一個(gè)DiskCache接口,里面的Factory類定義了默認(rèn)的磁盤緩存大小為:250 M , 緩存路徑在:image_manager_disk_cache 目錄下
? ? ? ? ? ?? ?
? ? ? ? ? ?在模擬器上可以查看緩存目錄的位置,有些真機(jī)看不到這個(gè)目錄,有可能數(shù)據(jù)庫(kù)沒有刷新的原因:
? ? ? ? ? ?
?
? ? ? ? 7.2、緩存模式
? ? ? 源碼中有枚舉類?DiskCacheStrategy 定義了四種緩存類型
- DiskCacheStrategy.SOURCE ? ?緩存原圖
- DiskCacheStrategy.RESULT ? ? 緩存和imageview大小匹配的圖
- DiskCacheStrategy.ALL ? ? ? ? ? 既緩存原圖,有緩存和imageview大小匹配的圖
- DiskCacheStrategy.NONE ? ? ? ?不做任何緩存
? ? ??
? ? ? ? ?通過(guò)查看源碼我們發(fā)現(xiàn),Glide默認(rèn)緩存策略是:?DiskCacheStrategy.RESULT
? ? ? ? ??
? ? ? ? ?7.3 四種緩存模式對(duì)比
? ? ? ? ? ? ? ?比如:網(wǎng)絡(luò)圖片我們叫做 big1.jpg ?寬高:3000 x 2000 ?大小:2.15 M 。 ?? ?
http://o7rvuansr.bkt.clouddn.com/big1.jpg? ? ? ? ? ? ?客戶端的 imageview 大小:300 x 300 ?? ? ? ? ? ? ? ? ??
<ImageViewandroid:id="@+id/image"android:layout_width="300dp"android:layout_height="300dp" />? ? ? ? ? ? ? ?(1)?DiskCacheStrategy.SOURCE ?: 只會(huì)緩存一張圖片,大小:2M ??
Glide.with( Activity2.this).load( url ).diskCacheStrategy( DiskCacheStrategy.SOURCE ).into( imageView ) ;? ? ? ? ? ? ? ?(2) DiskCacheStrategy.RESULT?: ?只緩存了一張圖片,大小:14 KB
Glide.with( Activity2.this).load( url ).diskCacheStrategy( DiskCacheStrategy.RESULT ).into( imageView ) ;? ? ? ? ? ? ? ?(3) DiskCacheStrategy.ALL ? ? : 緩存了兩張圖片, 一張大小:2 M , 一張大小:14 KB
Glide.with( Activity2.this).load( url ).diskCacheStrategy(DiskCacheStrategy.ALL ).into( imageView ) ;? ? ?? ? ? ? ? ? ? ?(4)?DiskCacheStrategy.NONE : ?沒有緩存圖片
? ? ? ? ? ? ? ? ? Glide.with( Activity2.this).load( url ).diskCacheStrategy(DiskCacheStrategy.NONE ).into( imageView ) ;
? ? ? ? 7.4、 緩存場(chǎng)景測(cè)試
? ? ? ? ? ? ? ? ? 兩個(gè)imageView ,一個(gè) 100 x 100 , 一個(gè) 300 x300 ; ?先加載第一張,再加載第二張
- 測(cè)試一 : 兩張圖片都在 ?DiskCacheStrategy.SOURCE?的情況下:? ? ? ? ??
? 通過(guò)測(cè)試發(fā)現(xiàn),在加載第一張圖片的時(shí)候,緩存了2M 的原始圖,在加載第二張的時(shí)候,就不會(huì)再請(qǐng)求網(wǎng)絡(luò),直接從緩存中加載。
- ?測(cè)試二:第一張圖在?DiskCacheStrategy.SOURCE ,第二張?jiān)贒iskCacheStrategy.RESULT 情況下?
通過(guò)測(cè)試發(fā)現(xiàn),加載第一張圖片的情況下,緩存了2M 的原始圖。在加載第二張圖片的時(shí)候,又請(qǐng)求網(wǎng)絡(luò),下載了 14 KB 的緩存。這說(shuō)明,即使本地存在緩存,緩存策略不一樣,緩存就不會(huì)被重用。
? ??
- ?測(cè)試三:兩張圖都在 DiskCacheStrategy.RESULT 情況下?,第一個(gè)Imageview大小: 100 x100 , 第二個(gè)imageview大小:300 x 300?
? ? ? ? ?(1)先加載 100 x 100 , 加載出來(lái)后,緩存了 2 kB 的圖片 ,然后加載 300 x 300 ,又重新請(qǐng)求網(wǎng)絡(luò),緩存了 14 KB 的圖片 。緩存沒有復(fù)用。
? ? ? ? ?(2)先加載 300 x 300 , 加載出來(lái)后,緩存了 14 KB的圖片。然后加載 100 x 100 ,又重新請(qǐng)求網(wǎng)絡(luò),緩存了 2 KB 的圖片,緩存沒有復(fù)用。
//加載第一張圖findViewById( R.id.bt1 ).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Glide.with( Activity2.this).load( url ).diskCacheStrategy( DiskCacheStrategy.RESULT ).into( imageView1 ) ;}});//加載第二張圖findViewById( R.id.bt2 ).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Glide.with( Activity2.this).load( url ).diskCacheStrategy( DiskCacheStrategy.RESULT ).into( imageView2 ) ;}});?
- ?測(cè)試四:imageView1 ?寬高:100 x 100 ?; ? ?imageView2 ? 寬高:300 x 300 ?; ? ??imageView3 ? ?寬高:600 x 600?
先加載 imageView2 ,請(qǐng)求網(wǎng)絡(luò), 緩存策略是 ?DiskCacheStrategy.ALL , 緩存了兩張圖 , 一張是 2 M , 一張是14 kB 。
? ? ? 再加載 imageView1 , 請(qǐng)求網(wǎng)絡(luò),緩存策略是 ?DiskCacheStrategy.RESULT ,緩存了一張圖,2 kB ??梢?imageview2 的緩存對(duì)image1不起作用。
? ? ? 最后加載 imageView3 , 請(qǐng)求網(wǎng)絡(luò),緩存策略是 DiskCacheStrategy.RESULT , 緩存了一張圖, 47 KB , 可見 imageview1 和 imageview2的緩存對(duì)imageView3 不起作用
? ? ? ?
- ?測(cè)試五:SimpleTarget 的使用 ?, imageview 大小:300 x 300 ?; 網(wǎng)絡(luò)圖片 寬高:3000 x 2000 ?大小:2 .15 M?;
? ? ? ?(1)?這種情況的緩存 2 M
Glide.with( Activity2.this).load( url ).diskCacheStrategy( DiskCacheStrategy.SOURCE ).into( imageView2 ) ;? ? ? ? (2)這種情況的緩存 14 KB
Glide.with( Activity2.this).load( url ).diskCacheStrategy( DiskCacheStrategy.RESULT ).into( imageView2 ) ;? ? ? ? ?(3)這種情況的緩存 777 KB
package app.zuil.com.glidedemo; import android.graphics.Bitmap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget;public class Activity2 extends AppCompatActivity {String url = "http://o7rvuansr.bkt.clouddn.com/big1.jpg" ;ImageView imageView2 ;private SimpleTarget target ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity1);imageView2 = (ImageView) findViewById( R.id.image2 );//加載第二張圖findViewById( R.id.bt2 ).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Glide.with( Activity2.this).load( url ).asBitmap().diskCacheStrategy( DiskCacheStrategy.RESULT ).into( target ) ;}});target = new SimpleTarget<Bitmap>() {@Overridepublic void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {//圖片加載完成imageView2.setImageBitmap( bitmap );}};} }(4)這種緩存 67 KB
package app.zuil.com.glidedemo;import android.graphics.Bitmap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView;import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget;public class Activity2 extends AppCompatActivity {String url = "http://o7rvuansr.bkt.clouddn.com/big1.jpg" ;ImageView imageView2 ;private static int width ;private static int height ;private SimpleTarget target ;private ViewGroup.LayoutParams params ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity1);imageView2 = (ImageView) findViewById( R.id.image2 );params = imageView2.getLayoutParams() ;//測(cè)量圖片的寬高width = params.width ;height = params.height ;//加載第二張圖findViewById( R.id.bt2 ).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Glide.with( Activity2.this).load( url ).asBitmap().diskCacheStrategy( DiskCacheStrategy.RESULT ).into( target ) ;}});target = new SimpleTarget<Bitmap>( width , height ) {@Overridepublic void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {//圖片加載完成imageView2.setImageBitmap(bitmap);}};} }- ?測(cè)試六:以上的測(cè)試都是在兩個(gè)imageView 大小不一樣的情況下?,F(xiàn)在來(lái)測(cè)試 兩個(gè)imageview大小相同的時(shí)候。 imageview1 , 寬高: 400 x 400 ; ?imageview2 , 寬高:400 x 400
(1)分析 imageView1 , 采用 DiskCacheStrategy.ALL ; imageView2 , 采用默認(rèn)的緩存策略,也就是 DiskCacheStrategy.RESULT 。
(2)先加載 imageview1 , 緩存了2個(gè)文件,一個(gè)是2 M , 一個(gè)事 22 KB ; 再加載 imageview2 , 發(fā)現(xiàn)沒有請(qǐng)求網(wǎng)絡(luò) , 直接使用了imageview1 的緩存。
(3)先加載 imageview2 ,緩存了1個(gè)文件,22 KB ; 然后再加載 imageview1 ,發(fā)現(xiàn)沒有請(qǐng)求網(wǎng)絡(luò),直接使用imageview2 的緩存。而且在緩存文件夾中一直只有1個(gè)22 KB 緩存,這時(shí)候我們就發(fā)現(xiàn),即使 imageview1 的緩存模式是 DiskCacheStrategy.ALL ,在這里似乎緩存原圖的功能失效了。
?
- ?測(cè)試七: imageview1 , 寬高: 400 x 400 ; ?imageview2 , 寬高:400 x 400
(1)先加載 imageview1 , 緩存了 1個(gè)文件 , 2M ; 然后再加載 imageview2 , 發(fā)現(xiàn)沒有請(qǐng)求網(wǎng)絡(luò),直接使用 imageview1 的緩存。兩個(gè)圖片完全加載出來(lái),緩存文件夾 一共只有 1個(gè)文件 , 2M ;
?(2) 先加載 Imageview2 , 緩存了 1個(gè)文件 , 22 KB ; 然后再加載 imageview1 , 發(fā)現(xiàn)沒有請(qǐng)求網(wǎng)咯, 直接用 imageview2 的緩存。兩個(gè)圖片完全加載出來(lái),緩存文件夾一共只有 1 個(gè)文件 , 22 KB 。 ?
?
?
?
?博客中的代碼示例都在?https://github.com/zyj1609wz/GlideDemo
?
總結(jié)
以上是生活随笔為你收集整理的android 图片加载库 Glide 的使用介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何处理 android 方法总数超过
- 下一篇: Android 视频播放器,在线播放