RecyclerView快速滑动速度

作者: CaptainJno | 来源:发表于2017-12-08 22:06 被阅读2605次

    最近用了一下领英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()方法,这么做可以,但是个人觉得麻烦,需要新搞个类,已有布局、代码都要改,我内心是拒绝的,不过还是可以参考嘛。

    相关文章

      网友评论

        本文标题:RecyclerView快速滑动速度

        本文链接:https://www.haomeiwen.com/subject/oixyixtx.html