在泰國(guó)舉行的谷歌開(kāi)發(fā)者論壇上,谷歌為我們介紹了一個(gè)名叫 Glide 的圖片加載庫(kù),作者是bumptech。這個(gè)庫(kù)被廣泛的運(yùn)用在google的開(kāi)源項(xiàng)目中,包括2014年google I/O大會(huì)上發(fā)布的官方app。
赤城網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站開(kāi)發(fā)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
https://github.com/bumptech/glide
1 2 3 | dependencies { compile 'com.github.bumptech.glide:glide:3.7.0' } |
如何查看最新版本
http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22glide%22
http://mrfu.me/2016/02/27/Glide_Getting_Started/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /** * 清除緩存 * @param context */ public void clearCache( final Context context ){ clearMemoryCache( context ); new Thread( new Runnable() { @Override public 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(); } |
5.1、在使用時(shí)需要給app添加聯(lián)網(wǎng)權(quán)限,沒(méi)有權(quán)限不會(huì)報(bào)錯(cuò),但是圖片加載不出來(lái),很坑爹?!?/p>
1 2 3 | <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、加載圖片的方法要寫(xiě)在 UI 線程中,Glide會(huì)做異步處理。
1 2 3 | p_w_picpathView = (ImageView) findViewById( R.id.p_w_picpath ); String url = "http://img5.jpg" ; Glide.with( this ).load( url ).into( p_w_picpathView ) ; |
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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 p_w_picpathView ; String url = "http://img5.imgtn.bdimg.com/it/u=2941079711,2736454066&fm=11&gp=0.jpg" ; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); p_w_picpathView = (ImageView) findViewById( R.id.p_w_picpath ); Glide.with( this ).load( url ).asBitmap().into( target ) ; } private SimpleTarget target = new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) { //圖片加載完成 p_w_picpathView.setImageBitmap(bitmap); } }; } |
特別注意 :.asBitmap() 一定要加,否則可能會(huì)出錯(cuò)
1 2 | p_w_picpathView = (ImageView) findViewById( R.id.p_w_picpath ); Glide.with( this ).load( url ).placeholder( R.drawable.user ).into( p_w_picpathView ) ; |
1 2 | p_w_picpathView = (ImageView) findViewById( R.id.p_w_picpath ); Glide.with( this ).load( url ).placeholder( R.drawable.user ).error( R.drawable.default_error ).into( p_w_picpathView ) ; |
在加載開(kāi)始--> 加載完成(失敗),顯示placeholder()圖片; 如果加載失敗,則顯示error() 里面的圖片。
1 2 | p_w_picpathView = (ImageView) findViewById( R.id.p_w_picpath ); Glide.with( this ).load( R.drawable.icon ).asBitmap().into( p_w_picpathView ) ; |
1 2 3 4 | p_w_picpathView = (ImageView) findViewById( R.id.p_w_picpath ); //sd卡上的一張圖片 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/temp.jpg" ; Glide.with( this ).load( path ).into( p_w_picpathView ) ; |
1 2 3 4 5 | p_w_picpathView = (ImageView) findViewById( R.id.p_w_picpath ); //sd卡上的一張圖片 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/temp.jpg" ; File file = new File( path ) ; Glide.with( this ).load( file ).into( p_w_picpathView ) ; |
1 2 3 4 5 | //sd卡上的一張圖片 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/temp.jpg" ; File file = new File( path ) ; Uri uri = Uri.fromFile( file ) ; Glide.with( this ).load( uri ).into( p_w_picpathView ) ; |
with(Context context). 使用Application上下文,Glide請(qǐng)求將不受Activity/Fragment生命周期控制。
with(Activity activity). 使用Activity作為上下文,Glide的請(qǐng)求會(huì)受到Activity生命周期控制。
with(FragmentActivity activity).Glide的請(qǐng)求會(huì)受到FragmentActivity生命周期控制。
with(android.app.Fragment fragment).Glide的請(qǐng)求會(huì)受到Fragment 生命周期控制。
with(android.support.v4.app.Fragment fragment).Glide的請(qǐng)求會(huì)受到Fragment生命周期控制。
請(qǐng)求會(huì)在onStop的時(shí)候自動(dòng)暫停,
在onStart的時(shí)候重新啟動(dòng),gif的動(dòng)畫(huà)也會(huì)在onStop的時(shí)候停止,以免在后臺(tái)消耗電量。
枚舉類 Priority 提供了幾種優(yōu)先級(jí)等級(jí) ,
默認(rèn)的是 : NORMAL
實(shí)例:
1 2 | Glide.with( this ).load( url2).priority(Priority.LOW ).into( p_w_picpathView2 ) ; Glide.with( this ).load( url3).priority(Priority.HIGH ).into( p_w_picpathView3 ) ; |
但是這里的優(yōu)先級(jí)只是在加載的過(guò)程中起一個(gè)參考作用, 并不決定真正的加載順序。
枚舉類 Priority 提供了幾種優(yōu)先級(jí)等級(jí) ,
默認(rèn)的是 : NORMAL
實(shí)例:
1 2 | Glide.with( this ).load( url2).priority(Priority.LOW ).into( p_w_picpathView2 ) ; Glide.with( this ).load( url3).priority(Priority.HIGH ).into( p_w_picpathView3 ) ; |
但是這里的優(yōu)先級(jí)只是在加載的過(guò)程中起一個(gè)參考作用, 并不決定真正的加載順序。
(一) 先加載原圖的十分之一作為縮略圖,再加載原圖
1 | Glide.with( thi ).load( url ).thumbnail( 0 .1f).into( p_w_picpathview ) ; |
(二)用本地的圖片作為縮略圖,然后再加載原圖
1 2 3 4 | DrawableRequestBuilder<Integer> thumbnailRequest = Glide .with( ThumbnailActivity. this ) .load(R.mipmap.ic_launcher); Glide.with( ThumbnailActivity. this ).load( ur2 ).thumbnail( thumbnailRequest ).into( p_w_picpathView2 ) ; |
1 2 | Glide.with( this ).load( url ).into( p_w_picpathView1 ) ; Glide.with( this ).load( url ).asGif().into( p_w_picpathView2 ) ; |
注意:如果把a(bǔ)sGif 換成 asBitmap 則會(huì)顯示一張靜態(tài)圖。
1 2 3 | p_w_picpathView = (ImageView) findViewById( R.id.p_w_picpath_video ); String files = Environment.getExternalStorageDirectory().getAbsolutePath() + "/yueyu.mkv" ; Glide.with( this ).load( files ).into( p_w_picpathView ) ; |
(1)只能加載本地視頻,網(wǎng)絡(luò)視頻無(wú)法加載。
(2)加載本地視頻顯示只是視頻的第一幀圖像,相當(dāng)于一張縮略圖。不能播放視頻。
.crossFade() 淡入淡出 , 也是默認(rèn)動(dòng)畫(huà)
.crossFade( int duration ) 定義淡入淡出的時(shí)間間隔
.dontAnimate() 不使用任何動(dòng)畫(huà)
glide 默認(rèn)啟用內(nèi)存緩存,如果想要禁止內(nèi)存緩存 ,使用 .skipMemoryCache( true )
自定義 GlideModule 的好處:
1、可以全局的改變 glide 的加載策略
2、可以自定義磁盤緩存目錄
3、可以設(shè)置圖片加載的質(zhì)量
1 2 3 4 5 6 7 8 9 10 11 12 | public class SimpleGlideModule implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { } @Override public void registerComponents(Context context, Glide glide) { } } |
可以看到重寫(xiě)了兩個(gè)方法,applyOptions() , registerComponents() . 兩個(gè)方法都沒(méi)有返回值 。我們著重于第一個(gè)方法,重點(diǎn)研究 GlideBuilder 。
1 2 3 | <meta-data android:name= "app.zuil.com.glidedemo.util.SimpleGlideModule" android:value= "GlideModule" /> |
name是:包名 + 類名
.setMemoryCache(MemoryCache memoryCache)
.setBitmapPool(BitmapPool bitmapPool)
.setDiskCache(DiskCache.Factory diskCacheFactory)
.setDiskCacheService(ExecutorService service)
.setResizeService(ExecutorService service)
.setDecodeFormat(DecodeFormat 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方法改變解析格式。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class SimpleGlideModule implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { //定義緩存大小為100M int 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 )); } @Override public void registerComponents(Context context, Glide glide) { } } |
在Glide源碼中有一個(gè)DiskCache接口,里面的Factory類定義了默認(rèn)的磁盤緩存大小為:250 M , 緩存路徑在:p_w_picpath_manager_disk_cache 目錄下
在模擬器上可以查看緩存目錄的位置,有些真機(jī)看不到這個(gè)目錄,有可能數(shù)據(jù)庫(kù)沒(méi)有刷新的原因:
源碼中有枚舉類 DiskCacheStrategy 定義了四種緩存類型
DiskCacheStrategy.SOURCE 緩存原圖
DiskCacheStrategy.RESULT 緩存和p_w_picpathview大小匹配的圖
DiskCacheStrategy.ALL 既緩存原圖,有緩存和p_w_picpathview大小匹配的圖
DiskCacheStrategy.NONE 不做任何緩存
通過(guò)查看源碼我們發(fā)現(xiàn),Glide默認(rèn)緩存策略是: DiskCacheStrategy.RESULT
比如:網(wǎng)絡(luò)圖片我們叫做 big1.jpg 寬高:3000 x 2000 大?。?.15 M 。
1 | http: //o7rvuansr.bkt.clouddn.com/big1.jpg |
客戶端的 p_w_picpathview 大?。?00 x 300
1 2 3 4 | <ImageView android:id= "@+id/p_w_picpath" android:layout_width= "300dp" android:layout_height= "300dp" /> |
(1) DiskCacheStrategy.SOURCE : 只會(huì)緩存一張圖片,大?。?M
Glide.with( Activity2.this).load( url ).diskCacheStrategy( DiskCacheStrategy.SOURCE ).into( p_w_picpathView ) ;
(2) DiskCacheStrategy.RESULT : 只緩存了一張圖片,大?。?4 KB
Glide.with( Activity2.this).load( url ).diskCacheStrategy( DiskCacheStrategy.RESULT ).into( p_w_picpathView ) ;
(3) DiskCacheStrategy.ALL : 緩存了兩張圖片, 一張大?。? M , 一張大小:14 KB
Glide.with( Activity2.this).load( url ).diskCacheStrategy(DiskCacheStrategy.ALL ).into( p_w_picpathView ) ;
(4) DiskCacheStrategy.NONE : 沒(méi)有緩存圖片
Glide.with( Activity2.this).load( url ).diskCacheStrategy(DiskCacheStrategy.NONE ).into( p_w_picpathView ) ;
兩個(gè)p_w_picpathView ,一個(gè) 100 x 100 , 一個(gè) 300 x300 ; 先加載第一張,再加載第二張
測(cè)試一 : 兩張圖片都在 DiskCacheStrategy.SOURCE 的情況下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //加載第一張圖 findViewById( R.id.bt1 ).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Glide.with( Activity2. this ).load( url ).diskCacheStrategy( DiskCacheStrategy.SOURCE ).into( p_w_picpathView1 ) ; } }); //加載第二張圖 findViewById( R.id.bt2 ).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Glide.with( Activity2. this ).load( url ).diskCacheStrategy( DiskCacheStrategy.SOURCE ).into( p_w_picpathView2 ) ; } }); |
通過(guò)測(cè)試發(fā)現(xiàn),在加載第一張圖片的時(shí)候,緩存了2M 的原始圖,在加載第二張的時(shí)候,就不會(huì)再請(qǐng)求網(wǎng)絡(luò),直接從緩存中加載。
測(cè)試二:第一張圖在 DiskCacheStrategy.SOURCE ,第二張?jiān)贒iskCacheStrategy.RESULT 情況下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //加載第一張圖 findViewById( R.id.bt1 ).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Glide.with( Activity2. this ).load( url ).diskCacheStrategy( DiskCacheStrategy.SOURCE ).into( p_w_picpathView1 ) ; } }); //加載第二張圖 findViewById( R.id.bt2 ).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Glide.with( Activity2. this ).load( url ).diskCacheStrategy( DiskCacheStrategy.RESULT ).into( p_w_picpathView2 ) ; } }); |
通過(guò)測(cè)試發(fā)現(xiàn),加載第一張圖片的情況下,緩存了2M 的原始圖。在加載第二張圖片的時(shí)候,又請(qǐng)求網(wǎng)絡(luò),下載了 14 KB 的緩存。這說(shuō)明,即使本地存在緩存,緩存策略不一樣,緩存就不會(huì)被重用。
測(cè)試三:兩張圖都在 DiskCacheStrategy.RESULT 情況下 ,第一個(gè)Imageview大?。?100 x100 , 第二個(gè)p_w_picpathview大小:300 x 300
(1)先加載 100 x 100 , 加載出來(lái)后,緩存了 2 kB 的圖片 ,然后加載 300 x 300 ,又重新請(qǐng)求網(wǎng)絡(luò),緩存了 14 KB 的圖片 。緩存沒(méi)有復(fù)用。
(2)先加載 300 x 300 , 加載出來(lái)后,緩存了 14 KB的圖片。然后加載 100 x 100 ,又重新請(qǐng)求網(wǎng)絡(luò),緩存了 2 KB 的圖片,緩存沒(méi)有復(fù)用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //加載第一張圖 findViewById( R.id.bt1 ).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Glide.with( Activity2. this ).load( url ).diskCacheStrategy( DiskCacheStrategy.RESULT ).into( p_w_picpathView1 ) ; } }); //加載第二張圖 findViewById( R.id.bt2 ).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Glide.with( Activity2. this ).load( url ).diskCacheStrategy( DiskCacheStrategy.RESULT ).into( p_w_picpathView2 ) ; } }); |
測(cè)試四:p_w_picpathView1 寬高:100 x 100 ; p_w_picpathView2 寬高:300 x 300 ; p_w_picpathView3 寬高:600 x 600
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //加載第二張圖 findViewById( R.id.bt1 ).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Glide.with( Activity2. this ).load( url ).into( p_w_picpathView1 ) ; } }); //加載第二張圖 findViewById( R.id.bt2 ).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Glid 猜你還喜歡下面的內(nèi)容 營(yíng)銷型網(wǎng)站建設(shè)知識(shí)
|