頻道欄目
首頁 > 資訊 > 其他綜合 > 正文

強力的圖片加載框架分析 Glide的配置(順便補充下CollapsingToolbarLayout的一些功能)

16-03-24        來源:[db:作者]  
收藏   我要投稿

這篇是Glide和Picasso的對比,分析的蠻不錯的

我們來貼下今天的例子

這里寫圖片描述

上圖中所有的圖片都是異步下載的,雖然圖片本身并不大,但是加載的還是很流暢的。

前面貼的那個傳送門已經把大致的文字描述都講了,那我干什么?

拆Configuration,常規使用Glide只需要
Glide.with(this).load(Config.IMAGE_URL).into(imageView);,但是在自己的實際場景下可能會有一些自定義的定制,那么就需要搞一個想ImageLoader里Application類里干的活了。

Starting in Glide 3.5, you can use the GlideModule interface to lazily configure Glide and register components like ModelLoaders automatically when the first Glide request is made.

從Glide3.5版本開始,你可以使用GlideModule接口來惰性的初始化以及聲明組件,當第一次加載請求出現時。

那么要如何使用呢?

實現GlideModule,像這樣。

public class GlideModuleConfig implements GlideModule {

    //在這里創建設置內容,之前文章所提及的圖片質量就可以在這里設置
    //還可以設置緩存池參數什么的
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
     builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

    //在這里注冊ModelLoaders
    //可以在這里清除緩存什么的
    @Override
    public void registerComponents(Context context, Glide glide) {
    glide.clearDiskCache();
    }
}

然后在我們的AndroidManifest.xml文件里添加我們這個模塊
像這樣

 
        

        
            
                

                
            
        
    

Glide是允許多個設置Model的所以必然會有沖突(如果有多個lib項目的話),可以使用



來避免這一類的問題

Disk Cache

You can use the GlideBuilder’s setDiskCache() method to set the location and/or maximum size of the disk cache. You can also disable the cache entirely using DiskCacheAdapter or replace it with your own implementation of the DiskCache interface. Disk caches are built on background threads to avoid strict mode violations using the DiskCache.Factory interface.

你可以使用GlideBuilder的setDiskCache() 方法來設置儲存位置以及一些儲存空間的大小.你也可以選擇經禁用或者寫自己的實現。磁盤高速緩存是在后臺線程實現的,它使用的是DiskCache.Factory接口

Size

By default Glide uses the InternalCacheDiskCacheFactory class to build disk caches. The internal cache factory places the disk cache in your application’s internal cache directory and sets a maximum size of 250MB. Using the cache directory rather than the external SD card means no other applications will be able to access the images you download. See Android’s Storage Options doc for more details.

這一串好長,我點名重點。 默認儲存在應用程序內部,而非SD卡等外部目錄,這樣其他程序也就無法訪問緩存的內容了,默認最大尺寸為250M。

默認在這:
int DEFAULT_DISK_CACHE_SIZE = 250 * 1024 * 1024;
String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";

那么我們如何設置自己的“工廠值”呢?

   builder.setDiskCache( new InternalCacheDiskCacheFactory(context,100*1024*1024));

Location

那如果我們不想存在內存里想存在SD卡可以嗎?

 builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "MY_CACHE_LOCATION", 100 * 1024 * 1024));

需要傳入3個參數context對象,緩存的路徑名稱,緩存大小

他其實是在SDCard/Android/data/你的應用包名/cache/目錄建了一個緩存的路徑名稱的文件夾來存放你的緩存內容。

Memory caches and pools

Size

Default sizes are determined by the MemorySizeCalculator class. The MemorySizeCalculator class takes into account the screen size available memory of a given device to come up with reasonable default sizes. You can construct your own instance if you want to adjust Glide’s defaults:

默認情況下緩存內容的尺寸是MemorySizeCalculator這個類來控制的,那么如何控制?根據所需控件大小來緩存(也就是傳送門文章里寫道的根據ImageView的大小來儲存圖片),同樣的如果你想自己自定義那么就自己實現

MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();

當你在使用的過程中對某個階段的內存有特殊操作,你可以這樣

在registerComponents方法里作如下操作。

 glide.setMemoryCategory(MemoryCategory.HIGH);

他有預設的一些枚舉值,你可以根據需要來選擇(也就是放大縮小之類的操作,這里指的是內存緩存部分和圖片池)

/**
     * Tells Glide's memory cache and bitmap pool to use at most half of their initial maximum size.
     */
    LOW(0.5f),
    /**
     * Tells Glide's memory cache and bitmap pool to use at most their initial maximum size.
     */
    NORMAL(1f),
    /**
     * Tells Glide's memory cache and bitmap pool to use at most one and a half times their initial maximum size.
     */
    HIGH(1.5f);

Memory Cache

Glide’s memory cache is used to hold resources in memory so that they are instantly available without having to perform I/O.

Glide’s的內存緩存都是儲存在內存中的使他們可以立即被使用,而不是必須走IO操作區讀寫

You can use GlideBuilder’s setMemoryCache() method to set the size and/or implementation you wish to use for your memory cache. The LruResourceCache class is Glide’s default implementation. You can set a custom maximum in memory byte size by passing in the size you want to the LruResourceCache constructor:

這一段也很啰嗦,反正就是告訴我們可以用LruResourceCache這個類來自定義內存的最大使用字節(看到這里很多小伙伴有疑慮,為什么會有2個所謂的內存空間,簡單的說就是 一個是你來放的容器,一個是拿來快速用的)

builder.setMemoryCache(new LruResourceCache(100*1024*1024));

Bitmap Pool

Glide’s bitmap pool is used to allow Bitmaps of a variety of different sizes to be re-used which can substantially reduce jank inducing garbage collections caused by pixel array allocations while images are being decoded.

白話解釋下,圖片池允許各種各樣不同尺寸的圖片被重新使用,反正就是按照控件大小來操作,可以將大大減少垃圾圖片的存在,同時由于像素陣列分配而圖像被解碼操作

You can use GlideBuilder’s setBitmapPool() method to set the size and/or implementation of the bitmap pool. The LruBitmapPool class is Glide’s default implementation. The LruBitmapPool class uses an LRU algorithm to retain the most recently used sizes of Bitmaps. You can set a custom maximum in memory byte size by passing the size you want to the LruBitmapPool constructor:

這一段反正意思就是你也可以setBitmapPool來自定義圖片池的大小,像這樣

builder.setBitmapPool(new LruBitmapPool(200*1024*1024));

Bitmap Format

The GlideBuilder class also allows you to set a global default for the preferred Bitmap configuration for your application.

By default Glide prefers RGB_565 because it requires only two bytes
per pixel (16 bit) and therefore has half the memory footprint of the
higher quality and system default ARGB_8888. RGB_565 however can have
issues with banding in certain images and also does not support
transparency.

If banding is a problem in your application and/or you want the
highest possible image quality, you can use GlideBuilder’s
setDecodeFormat method to set DecodeFormat.ALWAYS_ARGB_8888 as Glide’s
preferred Bitmap configuration:

builder.setDecodeFormat(DecodeFormat.ALWAYS_ARGB_8888);

這部分在傳送門里有提到,不翻譯不解釋了,打了那么多手累了。

總結:簡單易用功能強大,性能好,速度快,很推薦

配置也比隔壁老王方便

git:https://github.com/bumptech/glide


接下來再補充個小知識點

上次提到的MD的dialog中提到了CollapsingToolbarLayout然后有有些小伙伴文怎么把那一坨顏色變成圖片什么的,那我也就實現了下,效果是這樣

這里寫圖片描述

然后收起來之后本身透明的toolbar也變成了綠色,本來綠色的CollapsingToolbarLayout的背景變成了圖片,那這是怎么做的呢?

 

contentScrim 設置當完全CollapsingToolbarLayout折疊(收縮)后的背景顏色(就是這么變綠的)

然后我暫時沒有找到標簽里有設置Title顏色的操作,但是java方法倒是有

類里面聲明對象

 CollapsingToolbarLayout toolbar_layout;

onCreate里面find一下,然后set一下就好。

  toolbar_layout = (CollapsingToolbarLayout) findViewById(R.id.toolbar_layout);
        toolbar_layout.setExpandedTitleColor(getResources().getColor(R.color.dialogColor));

不太推薦大家該一個imageview進去然后再插textview什么的 畢竟有android:background="@drawable/gee"為什么不用呢?

源碼地址:https://github.com/ddwhan0123/BlogSample/blob/master/GlideDemo.zip

 
 
相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片