package com.marverenic.music.view; import android.content.Context; import android.support.v7.widget.LinearSmoothScroller; import android.util.DisplayMetrics; import android.view.View; public class SnappingScroller extends LinearSmoothScroller { private static final float MILLISECONDS_PER_INCH = 100f; public static final int SNAP_TO_START = LinearSmoothScroller.SNAP_TO_START; public static final int SNAP_TO_END = LinearSmoothScroller.SNAP_TO_END; private Context mContext; private int mSnapPreference; private float mMillisecondsPerPixel; public SnappingScroller(Context context, int snap) { super(context); mContext = context; mSnapPreference = snap; } @Override protected int getHorizontalSnapPreference() { return mSnapPreference; } @Override protected int getVerticalSnapPreference() { return mSnapPreference; } @Override protected void onStart() { super.onStart(); View firstView = getLayoutManager().getChildAt(0); int firstViewPosition = getChildPosition(firstView); int intermediateViewCount = Math.abs(firstViewPosition - getTargetPosition()); DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics(); mMillisecondsPerPixel = getSpeedPerPixel(displayMetrics, intermediateViewCount); } private float getSpeedPerPixel(DisplayMetrics displayMetrics, int intermediateViewCount) { int dpi = displayMetrics.densityDpi; return MILLISECONDS_PER_INCH / (float) Math.sqrt(intermediateViewCount) / dpi; } @Override protected int calculateTimeForScrolling(int dx) { return (int) Math.ceil(Math.abs(dx) * mMillisecondsPerPixel); } }