RecyclerView快速滑动到顶部

记录一下工具类

参考:https://www.jianshu.com/p/9be8a3da5ced

/**
 * 修改 SmoothScrollToPosition(int position) 按一定速度滚动到指定的位置 的滑动速度
 * 如果要修改滑动速度,那么新建一个LayoutManager,然后重写SmoothScrollToPosition,
 * 然后新建一个Scroller,在Scroller里面的calculateSpeedPerPixel
 * 或者calculateTimeForScrolling方法修改对应的参数即可修改成功
 */
public class FastScrollLayoutManager extends StaggeredGridLayoutManager {

    //滑动一英寸 需要的时间,减小这个值,即加速滑动
    private float MILLISECONDS_PER_INCH = 0.03f;

    private Context mContext;

    public FastScrollLayoutManager(int spanCount, int orientation, Context context, float timePerInch) {
        super(spanCount, orientation);
        mContext = context;
        setSpeed(timePerInch);
    }

    private void setSpeed(float timePerInch) {
        MILLISECONDS_PER_INCH = mContext.getResources().getDisplayMetrics().density * timePerInch;

    }


    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
        LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
            @Nullable
            @Override
            public PointF computeScrollVectorForPosition(int targetPosition) {
                return FastScrollLayoutManager.this.computeScrollVectorForPosition(targetPosition);
            }

            // 计算每px滑动的时间,来控制滑动速度
            @Override
            protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
                // 默认单位速度 25F/densityDpi
                // return 1F / displayMetrics.densityDpi;
                //滑动一英寸的时间除以 显示器的逻辑密度,即每个px的滑动时间
                return MILLISECONDS_PER_INCH / displayMetrics.density;
            }

            //该方法计算滑动所需时间。在此处间接控制速度。
            @Override
            protected int calculateTimeForScrolling(int dx) {
                /**
                 控制距离, 然后根据上面那个方(calculateSpeedPerPixel())提供的速度算出时间,
                 默认一次 滚动 TARGET_SEEK_SCROLL_DISTANCE_PX = 10000个像素,
                 在此处可以减少该值来达到减少滚动时间的目的.
                 */
                //间接计算时提高速度,也可以直接在calculateSpeedPerPixel提高
                //                if (dx > 3000) {
                //                    dx = 3000;
                //                }
                return super.calculateTimeForScrolling(dx);
            }
        };

        linearSmoothScroller.setTargetPosition(position);
        startSmoothScroll(linearSmoothScroller);
    }

}

猜你喜欢

转载自blog.csdn.net/hpp_1225/article/details/85052717