還有點bug,建議使用 LinearSnapHelperjava
rvPilotList.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); // offsetY += dy; // // int first = linearLayoutManager.findFirstCompletelyVisibleItemPosition(); // int last = linearLayoutManager.findLastCompletelyVisibleItemPosition(); // View firstview = linearLayoutManager.findViewByPosition(first); // if (viewWidth == 0) { // viewWidth = firstview.getHeight(); // } // int offseta = firstview.getTop(); // float sx = 1f + (float) offseta / viewWidth; // if (offsetY == 0) { // View view = linearLayoutManager.findViewByPosition(first + 1); // scaleUp(view); // } // // firstview.setScaleX(sx); // View lastview = linearLayoutManager.findViewByPosition(last); // offseta = recyclerView.getHeight() - lastview.getBottom(); // sx = 1f + (float) offseta / viewWidth; // lastview.setScaleX(sx); } @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == 0) { int visibleItem = linearLayoutManager.getChildCount(); int coun = 0; if (visibleItem % 2 == 1) { coun = (visibleItem - 1) / 2; } else { coun = visibleItem / 2; } Log.i(TAG, "onScrollStateChanged: " + visibleItem); Log.i(TAG, "onScrollStateChanged: coun" + coun); int postion = linearLayoutManager.findFirstVisibleItemPosition(); Log.i(TAG, "onScrollStateChanged: postion" + postion); View view; Log.i(TAG, "findFirstCompletelyVisibleItemPosition: " + linearLayoutManager.findFirstCompletelyVisibleItemPosition()); if (postion == 0 && linearLayoutManager.findFirstCompletelyVisibleItemPosition() != 0) { view = linearLayoutManager.findViewByPosition(0); } else { view = linearLayoutManager.findViewByPosition(postion + coun); } int pm = ((ViewGroup) view.getParent()).getMeasuredWidth(); int left = view.getLeft() + view.getWidth() / 2; int offset = 0; if (left == pm / 2) { return; } if (left < pm / 2) { offset = -(pm / 2 - left); } else { offset = left - pm / 2; } rvPilotList.smoothScrollBy(offset, 0); } } });