+public class SlideLayoutManager extends LinearLayoutManager {
+ private Context context;
+ private RecyclerView recyclerView;
+ private OnItemSelectedListener listener;
+ public SlideLayoutManager(
+ RecyclerView recyclerView,
+ OnItemSelectedListener listener) {
+ this.context = context;
+ this.listener = listener;
+ this.recyclerView = recyclerView;
+ public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+ super.onLayoutChildren(recycler, state);
+ public void onScrollStateChanged(int state) {
+ super.onScrollStateChanged(state);
+ if (state == RecyclerView.SCROLL_STATE_IDLE) {
+ float minDistance = recyclerView.getHeight();
+ for (int i = 0; i < recyclerView.getChildCount(); i++) {
+ View child = recyclerView.getChildAt(i);
+ float distanceFromCenter = distanceFromCenter(child);
+ if (distanceFromCenter < minDistance) {
+ minDistance = distanceFromCenter;
+ position = recyclerView.getChildLayoutPosition(child);
+ listener.onItemSelected(position);
+ public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
+ if (getOrientation() == LinearLayoutManager.VERTICAL) {
+ int scrolled = super.scrollVerticallyBy(dy, recycler, state);
+ private float distanceFromCenter(View child) {
+ float mid = getHeight() / 2.0f;
+ float childMid = (getDecoratedBottom(child) + getDecoratedTop(child)) / 2.0f;
+ return Math.abs(mid - childMid);
+ private void scaleDownView() {
+ for (int i = 0; i < getChildCount(); i++) {
+ View child = getChildAt(i);
+ TextView textView = child.findViewById(R.id.text);
+ float distanceFromCenter = distanceFromCenter(child);
+ float scale = (float) (1 - Math.sqrt(distanceFromCenter / getHeight()) * 0.33f);
+ textView.setScaleX(scale);
+ textView.setScaleY(scale);
+ public interface OnItemSelectedListener {
+ void onItemSelected(int layoutPosition);