最近接手的一個android項目里面,有個viewpager+3個fragment的頁面,就是很常見的可以左右滑動切換頁面的那種布局。接手的時候告訴我,這個頁面有卡頓現象,性能需要優化。一開始覺得是fragment里面做了太多耗時操作的原因,后來居然搞了一天才搞完,算是踩了個坑,這里記錄下。
頁面滑動卡頓一般會想到在頁面滑動事件回調方法里是不是有什么耗時操作,比如加載圖片,讀取文件之類,但是排查之后都沒有類似的代碼邏輯。后來各種調試,才發現主要有兩個原因:
背景圖片的資源圖片文件要放到mipmap-xxxx文件夾下,或者放到drawable-xxxx文件夾下,不能直接放在drawable文件夾下
之前各種代碼邏輯排查未果之后,我就開始考慮是不是背景圖片設置的原因,因為這三個fragment都是設置了一個全屏的圖片背景。所設置的背景圖片都是1920x1080像素的jpg格式圖片,大小為208KB。我把背景圖片都去掉換成純色的背景,頁面立馬就變得非常流暢,一點掉幀都沒有了。
但是背景圖是肯定不能換掉的,所以我就在圖片大小上做文章,讓美工mm給換成了體積小點的圖片,但是后面我就算換成了15KB大小的背景圖,頁面卡還是卡。
后來還發現,就算把fragment的背景全部設置成透明,只把viewpager的背景設置成一張圖片背景,或者吧fragment和viewpager的背景都設置為透明,把activity的背景設置成圖片背景,都還是會使得頁面在滾動的時候掉幀。
所以這肯定不是背景圖片大小引發的問題。
后來終于在stackoverflow上找到了一種說法:drawable文件夾(后面不帶后綴的)下直接放圖片資源文件會引起頁面掉幀。我到自己項目里面一找,果然,背景圖片就是直接放在drawable文件夾下的。我把drawable下圖片資源全部拷貝到mipmap文件夾下,一跑,嗯,卡頓少了很多,勉強能看得過去了,但是還是能感覺到有些掉幀。
manifests清單文件中,application的屬性hardwareAccelerated要設置為開啟
之前的修改雖然使得頁面勉強能用了,但是還是感覺有點掉幀。我就想到了硬件加速,一般這個屬性是默認開啟的。一檢查清單文件,果然寫著:
android:hardwareAccelerated="false"
真的是坑爹啊。。。
以上兩個問題都修改過之后,頁面就變得絲滑般順暢了。主要是第一個原因,沒遇到過的真的一時會想不到。