国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android列表動圖展示的實現策略

2019-10-21 21:36:13
字體:
來源:轉載
供稿:網友

前言

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

Android,列表,動圖,策略

某音

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

圖片加載框架選擇

對于動圖的加載,尤其是webp格式的動圖,Fresco真是不二的選擇,而且fresco本身對內存的處理也很棒,本文是基于Fresco 1.0.10版本,如果使用低版本Fresco出現無解的問題時,不妨可以試著升級Fresco版本。

圖片展示的策略

只在當前頁展示

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

Android,列表,動圖,策略

首頁

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

    Animatable animatable = mSimpleDraweeView.getController().getAnimatable();    if (animatable != null) {      animatable.start();       // later      animatable.stop();     }

只在可見區域展示

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

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

上面的第二、第三個處理會有些許的代碼量,而且重點是時機的判斷不是動圖的處理,這里著重講策略,代碼就略過了。對于第一個處理,Fresco本身是支持的:

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

setAutoPlayAnimations即表示是否在加載完成之后立即播放動圖,這里設置為false即可,滑入播放調用上一張圖的方法就行了??墒沁€有一種情況,動圖在我們滑入的時候還沒有加載完成,那么我們就可以設置一個標示來表示是否播放,因為SimpleDrwaView是可以拿到動圖加載的回調的:

 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的時候都對狀態進行了判斷。

圖片的規格尺寸

規格

相較于傳統的gif,同質量的webp體積更小,更能節省存儲空間,但是在解碼上webp更為耗時,所以能用webp盡量用webp,實在還是卡再考慮用gif。

幀率

目前調研發現的動圖幀率一般是10幀或者20幀,幀率不要太高了,不然會加大cpu的占用率,其實如果Fresco的使用方式沒出問題,內存的問題Fresco已經幫你搞定了,其他的優化主要是針對cpu占用率優化的。在項目中我們加載的動圖最后采用的是20幀(模仿騰訊謀產品的策略,最好控制在10幀其實,這款騰訊的產品在一頁上展示的動圖明顯比其他同類型產品展示的數量少)。

大小

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

在實際的開發中,可能因為業務的關系,上述的策略不能保證全部都做到,這里時候就得根據業務形態做對應的取舍,這里可能是一個長久優化的過程,畢竟這種新的動圖封面設計以前都沒有遇到過。

總結:

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 定陶县| 巍山| 开江县| 阿勒泰市| 沿河| 赞皇县| 隆昌县| 上高县| 秭归县| 隆德县| 西贡区| 镇江市| 太湖县| 曲靖市| 遂宁市| 菏泽市| 肃南| 巨鹿县| 靖州| 泽普县| 海伦市| 仁怀市| 宣城市| 尼勒克县| 额济纳旗| 自治县| 霞浦县| 雅安市| 墨竹工卡县| 澄城县| 白银市| 永济市| 永城市| 长寿区| 霞浦县| 贡觉县| 霸州市| 清苑县| 松原市| 思南县| 贞丰县|