?? Hi,我是小余。
本文已收錄到 GitHub · Androider-Planet 中。這里有 Android 進(jìn)階成長(zhǎng)知識(shí)體系,關(guān)注公眾號(hào) [小余的自習(xí)室] ,在成功的路上不迷路!
前言
前面一篇文章我們做了一個(gè)組件化網(wǎng)絡(luò)請(qǐng)求庫(kù):lib_network的封裝
相關(guān)文章:
Android組件化開(kāi)發(fā)(二)--網(wǎng)絡(luò)請(qǐng)求組件封裝
今天我們來(lái)封裝一個(gè)圖片加載庫(kù):lib_image_loader
其實(shí)封裝思想都是一樣的:
主要還是根據(jù)三步走:
- 1.需求分析
- 2.技術(shù)選型
- 3.根據(jù)1和2進(jìn)行類庫(kù)封裝
1.需求分析
- 1.首先他是一個(gè)
圖片加載庫(kù):
那就要考慮到我們需要加載哪些種類的圖片?png,jpg?gif?webp?balabala。。
- 2.具體到我們項(xiàng)目中:
常見(jiàn)圖片加載場(chǎng)景:
- 1.對(duì)ImageView設(shè)置src?
- 2.對(duì)View或者ViewGroup設(shè)置背景色。?
- 3.對(duì)目標(biāo)對(duì)象設(shè)置圖片,設(shè)置到一個(gè)Target中,設(shè)置通知欄的圖片信息?
- 4.設(shè)置通知欄的圖片信息
- 5.顯示圓角圖片
3.多張圖片可以
并發(fā)加載4.圖片
自適應(yīng)我們的控件5.
api使用簡(jiǎn)單,侵入性低。
2.技術(shù)選型
有了第一步的需求分析:我們?cè)賮?lái)選擇對(duì)應(yīng)的技術(shù)
如何選擇合適的類庫(kù)進(jìn)行封裝?
一般圖片加載庫(kù),有
Glide,Fresco,Picasso,而Glide是Picasso一種升級(jí)版本,可以只看Glide就可以,
為了選擇合適的類庫(kù),本人去Glide和Fresco官網(wǎng)查看了下他們的優(yōu)缺點(diǎn):Fresco最大的優(yōu)點(diǎn)是在5.0以下機(jī)型,將
Bitmap的字節(jié)數(shù)組放在一個(gè)特殊的位置,
而不占用堆中的資源,這樣就可以避免OOM的發(fā)生,但是目前5.0以下的設(shè)備占比已經(jīng)很少了,所以這個(gè)優(yōu)點(diǎn)可以忽略不計(jì)。其他方面也基本能滿足我們的需求,都支持
gif和webp格式的圖片數(shù)據(jù),但是
Glide相比較Fresco來(lái)說(shuō),api使用簡(jiǎn)單,對(duì)業(yè)務(wù)代碼沒(méi)有侵入性,而Fresco需要使用他的特定控件才能使用,且需要在application中做初始化操作,有一定的侵入性
基于以上幾點(diǎn),筆者考慮使用Glide來(lái)封裝我們的類庫(kù)。
如果有想自己開(kāi)發(fā)一套更加原生的圖片加載庫(kù)的同學(xué),可以參考這篇文章:
面試官:讓你設(shè)計(jì)一套圖片加載框架,你會(huì)怎么設(shè)計(jì)?
但是不推薦大家去重復(fù)造輪子,沒(méi)必要,但是你必須了解其內(nèi)部原理。
封裝
有了前兩個(gè)步驟,我們就可以開(kāi)始我們的類庫(kù)封裝了。
我們要封裝哪些東西呢?還是根據(jù)我們的需求來(lái)
- 1.對(duì)
ImageView設(shè)置src - 2.對(duì)
View或者ViewGroup設(shè)置背景色 - 3.對(duì)目標(biāo)對(duì)象設(shè)置圖片,設(shè)置到一個(gè)
Target中或者說(shuō)是直接回調(diào)一個(gè)Bitmap給上層 - 4.設(shè)置通知欄的圖片信息
- 5.顯示圓角圖片
基于以上需求筆者做了以下封裝
1.對(duì)ImageView設(shè)置src
/**創(chuàng)建一個(gè)設(shè)置ImageView src的接口
* @param imageView
* @param url
*/
public void displayImageForIView(ImageView imageView, String url, CustomRequestListener listener){
Glide.with(imageView.getContext())
.load(url)
.apply(initCommonOptions())
.into(imageView);
}
2.對(duì)View或者ViewGroup設(shè)置背景色
/**創(chuàng)建一個(gè)設(shè)置View背景的接口
* @param view
* @param url
* @param listener
*/
public void displayImageForView(final View view, String url,CustomRequestListener listener){
Glide.with(view.getContext())
.asBitmap()
.load(url)
.listener(listener)
.apply(initCommonOptions())
.into(initCustomViewTarget(view));
}
3.對(duì)目標(biāo)對(duì)象設(shè)置圖片,設(shè)置到一個(gè)Target中或者說(shuō)是直接回調(diào)一個(gè)Bitmap給上層,用戶希望自己處理Bitmap顯示
/**回調(diào)一個(gè)Bitmap給上層
*/
public void displayImageForCallBack(Context context, String url, BitmapRequestListener listener){
Glide.with(context)
.asBitmap()
.load(url)
.into(new JustReadyTarget(listener));
}
4.設(shè)置通知欄的圖片信息,一般用在音樂(lè)播放器等場(chǎng)景
/**創(chuàng)建一個(gè)給通知欄RemoteViews設(shè)置src的接口
* @param context
* @param remoteViews
* @param id
* @param notification
* @param notificationId
* @param url
*/
public void displayImageForNotification(Context context, RemoteViews remoteViews, int id,
Notification notification,int notificationId,String url){
Glide.with(context)
.asBitmap()
.load(url)
.apply(initCommonOptions())
.into(new NotificationTarget(context,id,remoteViews,notification,notificationId));
}
5.顯示圓角圖片
/**給ImageVIew設(shè)置一個(gè)圓形的view
* @param imageView
* @param url
*/
public void displayImageForCircleView(ImageView imageView,String url){
Glide.with(imageView)
.asBitmap()
.load(url)
.into(new BitmapImageViewTarget(imageView){
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory
.create(imageView.getResources(),resource);
drawable.setCircular(true);
imageView.setImageDrawable(drawable);
}
});
}
這里對(duì)常見(jiàn)的一些需求做了封裝,完整代碼可以看demo
GitHub - ByteYuhb/anna_music_app
總結(jié)
此篇文章主要是對(duì)組件化框架中功能組件:圖片加載框架的封裝,
對(duì)于大部分類庫(kù)的封裝都可以使用我們上面的思路,再結(jié)合maven私服的使用??梢院芎玫膶⑽覀兇a作為一個(gè)組件共享給開(kāi)發(fā)同事使用
組件化道路長(zhǎng)遠(yuǎn),到目前為止我們封裝兩個(gè)功能框架:網(wǎng)絡(luò)請(qǐng)求庫(kù)和圖片加載庫(kù),后面會(huì)不定期對(duì)其他類庫(kù)進(jìn)行封裝,最后整合成一個(gè)完整的組件化框架