public SnappySmoothScroller build(Context context) { SnappySmoothScroller scroller = new SnappySmoothScroller(context); scroller.setTargetPosition(position); if (scrollVectorDetector != null) { scroller.setScrollVectorDetector(scrollVectorDetector); } if (snapType != null) { scroller.setSnapType(snapType); } if (snapDuration >= 0) { scroller.setSnapDuration(snapDuration); } if (snapInterpolator != null) { scroller.setSnapInterpolator(snapInterpolator); } if (seekDuration >= 0) { scroller.setSeekDuration(seekDuration); } scroller.setSnapPaddingStart(snapPaddingStart); scroller.setSnapPaddingEnd(snapPaddingEnd); return scroller; } }
@Override public int calculateDxToMakeVisible(View view, int snapPreference) { int dx = super.calculateDxToMakeVisible(view, snapPreference); if (dx == 0) { return dx; } switch (snapType) { case START: dx = adjustDxForLeft(dx); break; case END: dx = adjustDxForRight(dx); break; case CENTER: if (dx > 0) { dx = adjustDxForRight(dx); } else { dx = adjustDxForLeft(dx); } break; } return dx; }
@Override public int calculateDyToMakeVisible(View view, int snapPreference) { int dy = super.calculateDyToMakeVisible(view, snapPreference); if (dy == 0) { return dy; } switch (snapType) { case START: dy = adjustDyForUp(dy); break; case END: dy = adjustDyForDown(dy); break; case CENTER: if (dy > 0) { dy = adjustDyForDown(dy); } else { dy = adjustDyForUp(dy); } break; case VISIBLE: } return dy; }
@Override protected void onTargetFound(View targetView, RecyclerView.State state, Action action) { final int dx = calculateDxToMakeVisible(targetView, getHorizontalSnapPreference()); final int dy = calculateDyToMakeVisible(targetView, getVerticalSnapPreference()); action.update(-dx, -dy, snapDuration, snapInterpolator); }
private void computeSeekDistance() { RecyclerView.LayoutManager layoutManager = getLayoutManager(); if (layoutManager != null && layoutManager.getChildCount() > 0 if (layoutManager.canScrollHorizontally()) { final int averageWidth = totalWidth / count; distanceX = Math.abs((currentPosition - getTargetPosition()) * averageWidth); if (layoutManager.canScrollVertically()) { final int averageHeight = totalHeight / count; distanceY = Math.abs((currentPosition - getTargetPosition()) * averageHeight);
private int adjustDxForRight(int dx) { final RecyclerView.LayoutManager layoutManager = getLayoutManager(); if (layoutManager == null || !layoutManager.canScrollHorizontally()) { return 0; } final View firstChild = layoutManager.getChildAt(0); final int position = layoutManager.getPosition(firstChild); if (position == 0) { final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) firstChild.getLayoutParams(); final int maxDx = -(layoutManager.getDecoratedLeft(firstChild) - params.leftMargin) + layoutManager.getPaddingLeft(); if (dx > maxDx) { return maxDx; } } return dx; }
@Override protected void onSeekTargetStep(int dx, int dy, RecyclerView.State state, Action action) { if (seekDistance == null) { computeSeekDistance(); } super.onSeekTargetStep(dx, dy, state, action); }
private int adjustDyForDown(int dy) { final RecyclerView.LayoutManager layoutManager = getLayoutManager(); if (layoutManager == null || !layoutManager.canScrollVertically()) { return 0; } final View firstChild = layoutManager.getChildAt(0); final int position = layoutManager.getPosition(firstChild); if (position == 0) { final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) firstChild.getLayoutParams(); final int maxDy = -(layoutManager.getDecoratedTop(firstChild) - params.topMargin) + layoutManager.getPaddingTop(); if (dy > maxDy) { return maxDy; } } return dy; }
private int adjustDxForLeft(int dx) { final RecyclerView.LayoutManager layoutManager = getLayoutManager(); if (layoutManager == null || !layoutManager.canScrollHorizontally()) { return 0; } final View lastChild = layoutManager.getChildAt(layoutManager.getChildCount() - 1); final int position = layoutManager.getPosition(lastChild); if (position == layoutManager.getItemCount() - 1) { final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) lastChild.getLayoutParams(); final int maxDx = layoutManager.getWidth() - layoutManager.getPaddingRight() - (layoutManager.getDecoratedRight(lastChild) + params.rightMargin); if (dx < maxDx) { return maxDx; } } return dx; }
private int adjustDyForUp(int dy) { final RecyclerView.LayoutManager layoutManager = getLayoutManager(); if (layoutManager == null || !layoutManager.canScrollVertically()) { return 0; } final View lastChild = layoutManager.getChildAt(layoutManager.getChildCount() - 1); final int position = layoutManager.getPosition(lastChild); if (position == layoutManager.getItemCount() - 1) { final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) lastChild.getLayoutParams(); final int maxDy = layoutManager.getHeight() - layoutManager.getPaddingBottom() - (layoutManager.getDecoratedBottom(lastChild) + params.bottomMargin); if (dy < maxDy) { return maxDy; } } return dy; }