Android組件化開(kāi)發(fā)(三)--圖片加載組件封裝

?? 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,jpggif?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ù),有GlideFresco,Picasso,而GlidePicasso一種升級(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ì)。

其他方面也基本能滿足我們的需求,都支持gifwebp格式的圖片數(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è)完整的組件化框架

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容