RecyclerView快速滑动速度

最近用了一下领英APP,发现RecyclerView快速滑动时,速度做了限制(上限)。这样做,可以避免过快加载内容,一定程度上保证APP不卡顿不掉帧(开启CPU呈现模式分析就能明显看出效果)。

限制速度的方法就是设置RecyclerView的最大滑动速度,直接上代码:

《RecyclerView快速滑动速度》 设置速度最大值

方法中参数 velocity 就是最大速度,你可以设置一个合适的值,比如先试试4000(单位是px)。

思路如下:

因为RecyclerView并没有提供API来修改速度,于是笔者想到了用反射来干,查看源代码后,找到关键点是RecyclerView类中的mMaxFlingVelocity属性,mMaxFlingVelocity从字面上一看就是快速滑动最大速度的意思。咱们来看看RecyclerView中这个属性相关的一些源代码:

《RecyclerView快速滑动速度》 mMaxFlingVelocity 是final
《RecyclerView快速滑动速度》 mMaxFlingVelocity 的赋初值
《RecyclerView快速滑动速度》 mMaxFlingVelocity 发挥最大值作用的关键代码

从上面代码可以看出,velocityY是实际速度,它的最终值通过Math.max()函数来取得velocityY和mMaxFlingVelocity绝对值较小的那个。

而因为mMaxFlingVelocity是 private和final,所以我们只能通过反射来修改它。于是有了开篇时候的代码。

其他知识点:

1、上面源代码有mMaxFlingVelocity=vc.getScaledMaximumFlingVelocity(),那么mMaxFlingVelocity的默认值是多少呢?

答案是:不确定。vc是ViewConfiguration类的对象,下面是android.view.ViewConfiguration中相关代码。虽然从资源文件中取得了8000dp(注意,这个单位是dp)这个数,但是会通过getDimensionPixelSize()方法,根据屏幕分辨率转换成px后,最终得出值:

《RecyclerView快速滑动速度》 get函数
《RecyclerView快速滑动速度》 dp转px并赋值
《RecyclerView快速滑动速度》 赋值来源

2、如果你想获取当前手机中RecyclerView快速滑动最大的速度是多少?

答案是:调用recyclerview.getScaledMaximumFlingVelocity()方法就能得到。

3、网上还有限制速度的其他解决方案(注:链接文章有一个地方写错了,看看细心的同学能不能发现!),比如有建议继承RecyclerView,重写fling()方法,这么做可以,但是个人觉得麻烦,需要新搞个类,已有布局、代码都要改,我内心是拒绝的,不过还是可以参考嘛。

    原文作者:CaptainJno
    原文地址: https://www.jianshu.com/p/01eb81c404cd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞