ViewPager圖片切換卡頓
閑暇時想到實現(xiàn)一個無限輪播Banner效果署浩,這里是通過ViewPager直接懟出來的,在簡單修改滑動邏輯之后達(dá)到想要的效果扫尺,在測試下Demo的穩(wěn)定性時筋栋,我使用了一個非正常手段——在極短的時間內(nèi)快速循環(huán)切換頁面,由于短時間內(nèi)切換較快且過于頻繁正驻,出現(xiàn)了界面切換卡頓的現(xiàn)象弊攘,具體效果如下:
查看系統(tǒng)日志發(fā)現(xiàn)提示出了如下信息:
Skipped 56 frames! The application may be doing too much work on its main thread.
// 跳過56幀!應(yīng)用程序可能在其主線程上做了太多的工作姑曙。
這里已經(jīng)很簡單也很直白的提示我們了襟交,我們在應(yīng)用主線程中做了太多的工作,導(dǎo)致了嚴(yán)重的跳幀伤靠,但是這些操作又不至于使程序達(dá)到ANR的地步捣域,所以才會由此提示。
理想狀態(tài)每秒展示60幀時人眼感受不到卡頓宴合,1000ms/60幀焕梅,即每幀繪制時間不應(yīng)超過16.67ms。如果大幅度超過這個值就會出現(xiàn)卡頓現(xiàn)象卦洽,系統(tǒng)也會發(fā)出提示贞言。
解決方法
這里要根據(jù)各位自身的設(shè)計情況有目的的去優(yōu)化,通過以下幾點(diǎn)基本上可以解決問題:
- 盡量減少Layout的布局層級
- item視圖復(fù)用阀蒂,避免不必要的新建
- 圖片壓縮该窗、緩存
-
關(guān)閉硬件加速
在Application加入代碼關(guān)閉硬件加速即可
android:hardwareAccelerated="false"
或者在View類中加入如下代碼:
setLayerType(View.LAYER_TYPE_SOFTWARE, null);// 關(guān)閉硬件加速
Note: 你可以關(guān)閉View級別的硬件加速打肝,但是你不能在View級別開啟硬件加速,因為它還依賴其他的設(shè)置挪捕。
-
設(shè)置緩存頁
使用setOffscreenPageLimit(int limit)
設(shè)置足夠的緩存頁粗梭。
在對圖片進(jìn)行壓縮處理后,通過實踐發(fā)現(xiàn)使用關(guān)閉硬件加速或設(shè)置緩存頁這兩種方法都可以有效解決切換卡頓問題(各位小哥在針對自己項目模塊進(jìn)行優(yōu)化時要有點(diǎn)耐心哦)级零。
注:從正常使用情況來說断医,Demo本身并沒太大問題,畢竟在正常的使用場景很少有人這么操作(本人親測RollPagerView也存在同樣的問題)奏纪,不過多學(xué)習(xí)學(xué)習(xí)總是好的鉴嗤。
【拓展閱讀】
Android流暢度之幀率
Android性能優(yōu)化第(十 一)篇---卡頓分析,正確評測流暢度
Android硬件加速原理與實現(xiàn)簡介
Android的硬件加速
如果您有更好的解決方案歡迎評論分享序调,如有錯誤醉锅,請批評指正,謝謝发绢。