Github
(前一篇ViewPager实现和本篇的代码,都在这个项目)
效果
第一行为ViewPager实现效果
第二行为RcyclerView+LinearSnapHelper 实现效果
重点
LinearSnapHelper是什么
LinearSnapHelper是一个让
RcyclerView在滑动scroll、快速滑动fling过程中,使得最后停止在一个Item的中间位置,而不是随意的一个位置
使用LinearSnapHelper后,如何让RcyclerView的第0个Item和最后一个Item居中显示
很显然,不做特殊处理,第0个和最后一个Item,无法居中;
我们只需要在第0个Item之前加上一个leftMargin,最后一个Item加上一个rightMargin即可
这个margin=RcyclerView中心点X坐标 减去 一个Item的宽度/2
final ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) holder.itemRoot.getLayoutParams();
// 为了居中, 第一个条目leftMagrin、最后一个条目的rightMargin是(recyclerView宽度减去一个条目的宽度)/2
int margin = (mRecyclerViewWidth - p.width) / 2;
if (position == 0) {
p.leftMargin = margin;
p.rightMargin = 0;
holder.itemRoot.setLayoutParams(p);
} else if (position == imageIdArray.length - 1) {
p.leftMargin = 0;
p.rightMargin = margin;
holder.itemRoot.setLayoutParams(p);
} else {
p.leftMargin = 0;
p.rightMargin = 0;
holder.itemRoot.setLayoutParams(p);
}
渐变动画的是实现(难点+数学)
遍历RcyclerView的每一个子view
(注意RcyclerView的子view等于当前屏幕内所有子view的总和,而不是RcyclerView内部item的总数量,缓存你懂得)
得到所有子view的x坐标
- 换算出每个子view的中心点x坐标,x+itemWidth/2
- 获得RcyclerView的中心点x坐标
- 计算出每个Item中心点x坐标与RcyclerView的中心点x坐标之差offX
- 根据第offX,计算出每个Item所应该缩放的比例interpretateScale
- 让每一个Item去缩放吧
mRecyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int childCount = mRecyclerview.getChildCount();
Log.e("ccc", childCount + "");
int[] location = new int[2];
for (int i = 0; i < childCount; i++) {
View v = mRecyclerview.getChildAt(i);
v.getLocationOnScreen(location);
int recyclerViewCenterX = mRecyclerview.getLeft() + mRecyclerview.getWidth() / 2