最近在做一个周日历的新需求,其中有个要求是要RecyclerView平滑的滑动到指定位置,刚开始的时候我以为只要调用smoothScrollToPosition
这个方法就可以了,测试的时候发现,smoothScrollToPosition
只会对不可见的item有效,对于已经可见的item滑动没有效果,于是翻看了一下smoothScrollToPosition
的源码,发现是调用了LayoutManger
的smoothScrollToPosition
方法。
1 2 3 4 5 6 7 8 9 |
|
发现其实是实例化了一个LinearSmoothScroller
,然后调用startSmoothScroll
将LinearSmoothScroller
传入进去。在StackOverflow上看到一个回答,复写了getVerticalSnapPreference
方法,返回SNAP_START
,由于我的RecyclerView
是水平滑动的,于是复写了getHorizontalSnapPreference
返回SNAP_START
,测试发现对可见的item也有滑动效果了,可是会有闪烁的现象。
继续看LinearSmoothScroller
源码,发现有calculateSpeedPerPixel
方法,默认是用25
去计算,复写这个方法,换一个大点的数去计算,发现滑动的速度慢下来了,闪烁的现象消失了。具体的代码可以参考WeeklyCalendarView。
问题虽然解决了,但是RecyclerView
与各个插件的协同工作机制,LayoutManager
,SmoothScroller
原理没来的及分析,这个留待以后分析。