最近用了一下领英APP,发现RecyclerView快速滑动时,速度做了限制(上限)。这样做,可以避免过快加载内容,一定程度上保证APP不卡顿不掉帧(开启CPU呈现模式分析就能明显看出效果)。
限制速度的方法就是设置RecyclerView的最大滑动速度,直接上代码:
设置速度最大值方法中参数 velocity 就是最大速度,你可以设置一个合适的值,比如先试试4000(单位是px)。
思路如下:
因为RecyclerView并没有提供API来修改速度,于是笔者想到了用反射来干,查看源代码后,找到关键点是RecyclerView类中的mMaxFlingVelocity属性,mMaxFlingVelocity从字面上一看就是快速滑动最大速度的意思。咱们来看看RecyclerView中这个属性相关的一些源代码:
mMaxFlingVelocity 是final mMaxFlingVelocity 的赋初值 mMaxFlingVelocity 发挥最大值作用的关键代码从上面代码可以看出,velocityY是实际速度,它的最终值通过Math.max()函数来取得velocityY和mMaxFlingVelocity绝对值较小的那个。
而因为mMaxFlingVelocity是 private和final,所以我们只能通过反射来修改它。于是有了开篇时候的代码。
其他知识点:
1、上面源代码有mMaxFlingVelocity=vc.getScaledMaximumFlingVelocity(),那么mMaxFlingVelocity的默认值是多少呢?
答案是:不确定。vc是ViewConfiguration类的对象,下面是android.view.ViewConfiguration中相关代码。虽然从资源文件中取得了8000dp(注意,这个单位是dp)这个数,但是会通过getDimensionPixelSize()方法,根据屏幕分辨率转换成px后,最终得出值:
get函数 dp转px并赋值 赋值来源2、如果你想获取当前手机中RecyclerView快速滑动最大的速度是多少?
答案是:调用recyclerview.getScaledMaximumFlingVelocity()方法就能得到。
3、网上还有限制速度的其他解决方案(注:链接文章有一个地方写错了,看看细心的同学能不能发现!),比如有建议继承RecyclerView,重写fling()方法,这么做可以,但是个人觉得麻烦,需要新搞个类,已有布局、代码都要改,我内心是拒绝的,不过还是可以参考嘛。
网友评论