RecyclerView:item点击居中效果实现

原理步骤:

  1. 继承LinearSmoothScroller,重写calculateDtToFit,计算滑动的距离;calculateSpeedPerPixel,计算每个像素滑动的速度。
  2. 继承LinearLayoutManager,重写smoothScrollToPosition,使用LinearSmoothScroller进行滑动。
  3. 使用自定义的layoutManager,在item点击回调中,调用layoutManager的smoothScrollToPosition即可。

代码:

/**
 * 用于RecyclerView点击item后,item居中
 */
public class CenterLayoutManager extends LinearLayoutManager {
    public CenterLayoutManager(Context context) {
        super(context);
    }

    public CenterLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    public CenterLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    /**
     * 
     * @param recyclerView 目标recyclerView
     * @param state new RecyclerView.State() 
     * @param position 需要滑动的item的position
     */
    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
        CenterSmoothScroll centerSmoothScroll = new CenterSmoothScroll(recyclerView.getContext());
        centerSmoothScroll.setTargetPosition(position);
        startSmoothScroll(centerSmoothScroll);
    }

    private class CenterSmoothScroll extends LinearSmoothScroller{

        public CenterSmoothScroll(Context context) {
            super(context);
        }
        //RecyclerView的中心点和item的中心点的相差即item需要移动的距离和方向
        @Override
        public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {
            return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2);
        }
        //计算每个像素滑动的速度
        @Override
        protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
            return 100f/displayMetrics.densityDpi;
        }
    }
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值