Android列表動圖展示策略

在最近的時間里,短視頻流行了起來捐韩,隨著這股潮流退唠,一種動圖封面的設計也被很多短視頻app采用:

某音

而在app中,動圖的展示是比較消耗性能的操作荤胁,對于這種一頁非常多的動圖在展示時需要做對應的處理瞧预,今天我結(jié)合自己在項目中處理的經(jīng)驗分享一下多動圖的處理策略。

圖片加載框架選擇

對于動圖的加載寨蹋,尤其是webp格式的動圖松蒜,F(xiàn)resco真是不二的選擇扔茅,而且fresco本身對內(nèi)存的處理也很棒已旧,本文是基于Fresco 1.0.10版本,如果使用低版本Fresco出現(xiàn)無解的問題時召娜,不妨可以試著升級Fresco版本运褪。

圖片展示的策略

  • 只在當前頁展示

我們知道,動圖是由一幀一幀的靜圖組成的玖瘸,通常來說我們需要這個動圖一直播放秸讹,也就是說動圖從加載完成之后會不停的渲染每一幀,拿某音舉例:

首頁

假設下面的“首頁”“雅倒、”關(guān)注”璃诀、“消息”、“我”4個tab都有動圖蔑匣,當我們點擊其他頁面時劣欢,當前頁被隱藏,而根據(jù)Fresco的官方文檔Fresco中文官方文檔通常只有當SimpleDrawView被移出屏幕才會停止播放動畫(我在測試中發(fā)現(xiàn)通常Activity生命周期級別的也會觸發(fā))裁良,所以當tab頁隱藏時動圖依舊在被渲染凿将,所以我們需要控制動圖的停止和播放,只有當前頁展示時价脾,才播放動圖:

                Animatable animatable = mSimpleDraweeView.getController().getAnimatable();
                if (animatable != null) {
                        animatable.start();
                            // later
                        animatable.stop();
                   }
  • 只在可見區(qū)域展示

當我們做列表動圖的時候牧抵,無論控件是listview還是recyclerview,數(shù)據(jù)和item的綁定都會在屏幕外綁定,而此時站在性能優(yōu)化的角度上犀变,是不需要渲染動圖的妹孙;當動圖滑動在列表邊界的時候,是不是說明用戶的焦點已經(jīng)不在這張圖上了获枝,所以此時可以提前在動圖滑出屏幕外之前停止動圖播放(在項目中我與產(chǎn)品商定動圖播放和停止的邊界值定為圖片的1/2涕蜂,也就是說圖片滑入屏幕自身長度1/2的時候播放動圖,滑出屏幕自身長度1/2的時候停止播放)映琳;當快速滑動的時候也應當停止動圖渲染(平時加載靜圖可能不需要在意机隙,但是在android老手機上加載很多動圖會使得cpu和內(nèi)存大幅度浮動)。

也就是說當列表在做數(shù)據(jù)綁定的時候我們應當先去加載圖片但并不渲染動圖萨西,動圖播放和停止唯一的判斷標準是滑入滑出屏幕的長度有鹿,如果是快速滑動則無視第二個規(guī)則直接停止所有的動圖。

上面的第二谎脯、第三個處理會有些許的代碼量葱跋,而且重點是時機的判斷不是動圖的處理,這里著重講策略源梭,代碼就略過了娱俺。對于第一個處理,F(xiàn)resco本身是支持的:

             DraweeController controller = Fresco.newDraweeControllerBuilder()
               .setUri(uri)
                  .setAutoPlayAnimations(false)
                     . // 其他設置(如果有的話)
                      .build();

setAutoPlayAnimations即表示是否在加載完成之后立即播放動圖废麻,這里設置為false即可荠卷,滑入播放調(diào)用上一張圖的方法就行了≈蚶ⅲ可是還有一種情況油宜,動圖在我們滑入的時候還沒有加載完成,那么我們就可以設置一個標示來表示是否播放怜姿,因為SimpleDrwaView是可以拿到動圖加載的回調(diào)的:

  ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
    @Override
    public void onFinalImageSet(
        String id,
        @Nullable ImageInfo imageInfo,
        @Nullable Animatable anim) {
        if (anim != null && tag == BEGAIN) {
          // 其他控制邏輯
          anim.start();
        }
    }
};

滑入屏幕時慎冤,就把tag 置為BEGAIN,滑出再置空就行了沧卢,并且這里我們不用擔心重復播放和停止的問題蚁堤,這里的anim對象其實是AnimatedDrawble2對象,而該對象在start和stop的時候都對狀態(tài)進行了判斷但狭。

圖片的規(guī)格尺寸

  • 規(guī)格
    相較于傳統(tǒng)的gif披诗,同質(zhì)量的webp體積更小,更能節(jié)省存儲空間熟空,但是在解碼上webp更為耗時藤巢,所以能用webp盡量用webp,實在還是卡再考慮用gif息罗。

  • 幀率
    目前調(diào)研發(fā)現(xiàn)的動圖幀率一般是10幀或者20幀掂咒,幀率不要太高了,不然會加大cpu的占用率,其實如果Fresco的使用方式?jīng)]出問題绍刮,內(nèi)存的問題Fresco已經(jīng)幫你搞定了温圆,其他的優(yōu)化主要是針對cpu占用率優(yōu)化的。在項目中我們加載的動圖最后采用的是20幀(模仿騰訊謀產(chǎn)品的策略孩革,最好控制在10幀其實岁歉,這款騰訊的產(chǎn)品在一頁上展示的動圖明顯比其他同類型產(chǎn)品展示的數(shù)量少)。

  • 大小
    動圖的大小也會影響解碼耗時膝蜈,在手機端可以使用小圖锅移,在項目中,我們手機端的動圖最多在200kb左右饱搏。

在實際的開發(fā)中非剃,可能因為業(yè)務的關(guān)系,上述的策略不能保證全部都做到推沸,這里時候就得根據(jù)業(yè)務形態(tài)做對應的取舍备绽,這里可能是一個長久優(yōu)化的過程,畢竟這種新的動圖封面設計以前都沒有遇到過鬓催。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肺素,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宇驾,更是在濱河造成了極大的恐慌倍靡,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飞苇,死亡現(xiàn)場離奇詭異菌瘫,居然都是意外死亡蜗顽,警方通過查閱死者的電腦和手機布卡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雇盖,“玉大人忿等,你說我怎么就攤上這事〈尥冢” “怎么了贸街?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狸相。 經(jīng)常有香客問我薛匪,道長,這世上最難降的妖魔是什么脓鹃? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任逸尖,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娇跟。我一直安慰自己岩齿,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布苞俘。 她就那樣靜靜地躺著盹沈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吃谣。 梳的紋絲不亂的頭發(fā)上乞封,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音岗憋,去河邊找鬼歌亲。 笑死,一個胖子當著我的面吹牛澜驮,可吹牛的內(nèi)容都是我干的陷揪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼杂穷,長吁一口氣:“原來是場噩夢啊……” “哼悍缠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起耐量,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤飞蚓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后廊蜒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趴拧,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年山叮,在試婚紗的時候發(fā)現(xiàn)自己被綠了著榴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡屁倔,死狀恐怖脑又,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锐借,我是刑警寧澤问麸,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站钞翔,受9級特大地震影響严卖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜布轿,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一哮笆、第九天 我趴在偏房一處隱蔽的房頂上張望俺亮。 院中可真熱鬧,春花似錦疟呐、人聲如沸脚曾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽本讥。三九已至,卻和暖如春鲁冯,著一層夾襖步出監(jiān)牢的瞬間拷沸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工薯演, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撞芍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓跨扮,卻偏偏與公主長得像序无,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子衡创,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,284評論 25 707
  • 用兩張圖告訴你帝嗡,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,744評論 2 59
  • 第二章:情欲寶典 平價小區(qū)璃氢,寧海市政府專門為那些家庭貧困之人建造的一座小區(qū)哟玷,以緩解住房問題,其租金當然不是很貴一也。 ...
    被遺忘的角落i閱讀 734評論 0 0
  • 站在陽臺 望遠處的夜 那里沒有星光 和這里一個樣 孩子哭著要睡覺 還沒洗明天的工裝 他們說人間有個天堂 在很遠的什...
    夕世風閱讀 383評論 0 3
  • 01 我看了第一集《歌手》椰苟,看到杜麗莎的時候抑月,我聽完她唱歌,就看不下去了尊剔。 講真爪幻,節(jié)目看不下去的原因就是好多人站起...
    喵姬閱讀 268評論 0 0