看源码之前先来了解一下这两个类的作用:LinearSnapHelper是用来在滑动结束时让最靠近中间的位置的子条目居中的,PagerSnapHelper不仅带有LinearSnapHelper居中的效果还带有ViewPager的效果,每次只能滑动一页。
SnapHelper的使用很简单一行代码搞定,实现如下:
new LinearSnapHelper().attachToRecyclerView(mRecyclerView)实现源码如下:
public void attachToRecyclerView(@Nullable RecyclerView recyclerView)
throws IllegalStateException {
if (mRecyclerView == recyclerView) {
return; // nothing to do
}
if (mRecyclerView != null) {
destroyCallbacks();
}
mRecyclerView = recyclerView;
if (mRecyclerView != null) {
setupCallbacks();
mGravityScroller = new Scroller(mRecyclerView.getContext(),
new DecelerateInterpolator());
snapToTargetExistingView();
}
}
此方法的意思就是持有当前绑定RecyclerView的引用,如果当前对象一样则不需要再次绑定,如果当前绑定对象不一样解除原来RecyclerView的注册事件,重新注册新的绑定RecyclerView的事件,绑定事件如下:
private void setupCallbacks() throws IllegalStateException {
if (mRecyclerView.getOnFlingListener() != null) {
throw new IllegalStateException("An instance of OnFlingListener already set.");
}
mRecyclerView.addOnScrollListener(mScrollListener);
mRecyclerView.setOnFlingListener(this);
}
这个方法一是监听了滚动事件,一个是监听了快速滑动事件。如果我们想自己写将滑动停止时最靠近中间的子条目居中显示的话,需要监听滚动事件,在滚动事件停止时,将缺的那点距离通过RecyclrView.scrollBy方法补齐。而snapToTargetExistingView方法实现如下:
void snapToTargetExistingView() {
if (mRecyclerView == null) {
return;
}
RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
if (layoutManager == null) {
return;
}
View snapView = findSnapView(layoutManager);
if (snapView == null) {
return;
}
int[] snapDistance = calculateDistanceToFinalSnap(layoutManager, snapView);
if (snapDistance[0] != 0 || snapDistance[1] != 0) {
mRecyclerView.smoothScrollBy(snapDistance[0], snapDistance[1]);
}
}
这个方法就是在重新绑定后用findSnapView找出符合规矩的的子条目,然后通过calculateDistanceToFinalSnap方法计算出距离最后通过

本文详细介绍了如何使用LinearSnapHelper和PagerSnapHelper在RecyclerView中实现自定义滑动行为,包括居中效果和ViewPager风格的一次滑动一格。核心内容包括计算滑动距离、找到最接近中间的子项、快速滑动定位等关键步骤。
2140

被折叠的 条评论
为什么被折叠?



