@Override
public void scrollToPosition(int position) {
mPosition = position;
mPositionOffset = 0;
requestLayout();
Log.d(TAG, "scrollToPosition " + position + " position " + mPosition + " positionOffset " + mPositionOffset);
}
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
Log.d(TAG, "smoothScrollTo " + position + " position " + mPosition + " positionOffset " + mPositionOffset);
FlipScroller scroller = new FlipScroller(recyclerView.getContext());
scroller.setTargetPosition(position);
startSmoothScroll(scroller);
}
private class FlipScroller extends LinearSmoothScroller {
private static final String TAG = "FlipScroller";
public FlipScroller(Context context) {
super(context);
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: ");
}
@Override
public int calculateDyToMakeVisible(View view, int snapPreference) {
final int position = getPosition(view);
final int now = mPositionOffset + mPosition * getItemHeightPositon();
final int to = position * getItemHeightPositon();
Log.d(TAG, "calculateDyToMakeVisible: position " + position + " ans " + (to - now));
return (now - to);
}
@Override
public int calculateDxToMakeVisible(View view, int snapPreference) {
return 0;
}
@Override
protected int calculateTimeForScrolling(int dx) {
Log.d(TAG, "calculateTimeForScrolling: ");
int time = super.calculateTimeForScrolling(dx*5);
return time;
}
}
以下四个方法是为了滑动时的对齐操作,不至于滑了半页然后就停在那
详细可看:https://www.jianshu.com/p/e54db232df62
*/
@Override
public PointF computeScrollVectorForPosition(int targetPosition) {
int dir = 0;
int now = mPosition * getItemHeightPositon() + mPositionOffset;
int to = targetPosition * getItemHeightPositon();
if (now > to) {
dir = -1;
} else if (now < to) {
dir = 1;
}
Log.d(TAG, "computeScrollVector " + dir + " now " + mPosition + " target " + targetPosition);
return new PointF(0, dir);
}
public int calculateDistance(View view) {
int pos = getPosition(view);
final int now = getItemHeightPositon() * mPosition + mPositionOffset;
final int to = getItemHeightPositon() * pos;
return to - now;
}
public int findTargetPosition(int vY) {
int ans = mPosition;
Log.d(TAG, "findTargetPosition: "+vY+"~"+mPositionOffset);
int absV = vY > 0 ? vY : -vY;
if (absV > mMinVy) {
if (vY * mPositionOffset > 0) {
int d = vY > 0 ? 1 : -1;
ans += d;
} else {
ans = mPosition;
}
} else {
ans = mPosition;
}
int count = getItemCount();
if (count == 0) {
return 0;
}
ans = Math.min(count - 1, Math.max(0, ans));
return ans;
}
public View findSnapView() {
Log.d(TAG, "findSnapView: "+getChildCount()+"~"+getItemCount());
for (int i = 0;i < getChildCount(); i ++ ){
View child = getChildAt(i);
if (getPosition(child) == mPosition) {
return child;
}
}
return null;
}