最近接手的一個(gè)android項(xiàng)目里面裆悄,有個(gè)viewpager+3個(gè)fragment的頁面党巾,就是很常見的可以左右滑動(dòng)切換頁面的那種布局萎庭。接手的時(shí)候告訴我,這個(gè)頁面有卡頓現(xiàn)象齿拂,性能需要優(yōu)化驳规。一開始覺得是fragment里面做了太多耗時(shí)操作的原因,后來居然搞了一天才搞完署海,算是踩了個(gè)坑吗购,這里記錄下。
頁面滑動(dòng)卡頓一般會(huì)想到在頁面滑動(dòng)事件回調(diào)方法里是不是有什么耗時(shí)操作砸狞,比如加載圖片巩搏,讀取文件之類,但是排查之后都沒有類似的代碼邏輯趾代。后來各種調(diào)試贯底,才發(fā)現(xiàn)主要有兩個(gè)原因:
背景圖片的資源圖片文件要放到mipmap-xxxx文件夾下,或者放到drawable-xxxx文件夾下撒强,不能直接放在drawable文件夾下
之前各種代碼邏輯排查未果之后禽捆,我就開始考慮是不是背景圖片設(shè)置的原因,因?yàn)檫@三個(gè)fragment都是設(shè)置了一個(gè)全屏的圖片背景飘哨。所設(shè)置的背景圖片都是1920x1080像素的jpg格式圖片胚想,大小為208KB。我把背景圖片都去掉換成純色的背景芽隆,頁面立馬就變得非常流暢浊服,一點(diǎn)掉幀都沒有了。
但是背景圖是肯定不能換掉的胚吁,所以我就在圖片大小上做文章牙躺,讓美工mm給換成了體積小點(diǎn)的圖片,但是后面我就算換成了15KB大小的背景圖腕扶,頁面卡還是卡孽拷。
后來還發(fā)現(xiàn),就算把fragment的背景全部設(shè)置成透明半抱,只把viewpager的背景設(shè)置成一張圖片背景脓恕,或者吧fragment和viewpager的背景都設(shè)置為透明,把a(bǔ)ctivity的背景設(shè)置成圖片背景窿侈,都還是會(huì)使得頁面在滾動(dòng)的時(shí)候掉幀炼幔。
所以這肯定不是背景圖片大小引發(fā)的問題。
后來終于在stackoverflow上找到了一種說法:drawable文件夾(后面不帶后綴的)下直接放圖片資源文件會(huì)引起頁面掉幀史简。我到自己項(xiàng)目里面一找乃秀,果然,背景圖片就是直接放在drawable文件夾下的。我把drawable下圖片資源全部拷貝到mipmap文件夾下环形,一跑,嗯衙傀,卡頓少了很多抬吟,勉強(qiáng)能看得過去了,但是還是能感覺到有些掉幀统抬。
manifests清單文件中火本,application的屬性hardwareAccelerated要設(shè)置為開啟
之前的修改雖然使得頁面勉強(qiáng)能用了,但是還是感覺有點(diǎn)掉幀聪建。我就想到了硬件加速钙畔,一般這個(gè)屬性是默認(rèn)開啟的。一檢查清單文件金麸,果然寫著:
android:hardwareAccelerated="false"
真的是坑爹啊擎析。。挥下。
以上兩個(gè)問題都修改過之后揍魂,頁面就變得絲滑般順暢了。主要是第一個(gè)原因棚瘟,沒遇到過的真的一時(shí)會(huì)想不到现斋。