记录一下工具类
参考: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);
}
}