ViewPager图片切换卡顿
闲暇时想到实现一个无限轮播Banner效果,这里是通过ViewPager直接怼出来的,在简单修改滑动逻辑之后达到想要的效果,在测试下Demo的稳定性时,我使用了一个非正常手段——在极短的时间内快速循环切换页面,由于短时间内切换较快且过于频繁,出现了界面切换卡顿的现象,具体效果如下:
查看系统日志发现提示出了如下信息:
Skipped 56 frames! The application may be doing too much work on its main thread.
// 跳过56帧!应用程序可能在其主线程上做了太多的工作。
这里已经很简单也很直白的提示我们了,我们在应用主线程中做了太多的工作,导致了严重的跳帧,但是这些操作又不至于使程序达到ANR的地步,所以才会由此提示。
理想状态每秒展示60帧时人眼感受不到卡顿,1000ms/60帧,即每帧绘制时间不应超过16.67ms。如果大幅度超过这个值就会出现卡顿现象,系统也会发出提示。
解决方法
这里要根据各位自身的设计情况有目的的去优化,通过以下几点基本上可以解决问题:
- 尽量减少Layout的布局层级
- item视图复用,避免不必要的新建
- 图片压缩、缓存
-
关闭硬件加速
在Application加入代码关闭硬件加速即可
android:hardwareAccelerated="false"
或者在View类中加入如下代码:
setLayerType(View.LAYER_TYPE_SOFTWARE, null);// 关闭硬件加速
Note: 你可以关闭View级别的硬件加速,但是你不能在View级别开启硬件加速,因为它还依赖其他的设置。
-
设置缓存页
使用setOffscreenPageLimit(int limit)
设置足够的缓存页。
在对图片进行压缩处理后,通过实践发现使用关闭硬件加速或设置缓存页这两种方法都可以有效解决切换卡顿问题(各位小哥在针对自己项目模块进行优化时要有点耐心哦)。
注:从正常使用情况来说,Demo本身并没太大问题,毕竟在正常的使用场景很少有人这么操作(本人亲测RollPagerView也存在同样的问题),不过多学习学习总是好的。
【拓展阅读】
Android流畅度之帧率
Android性能优化第(十 一)篇---卡顿分析,正确评测流畅度
Android硬件加速原理与实现简介
Android的硬件加速
如果您有更好的解决方案欢迎评论分享,如有错误,请批评指正,谢谢。