存在这样的问题,我有水平RecyclerView
,其中每个单元格都小于屏幕宽度。
所以我在这里找到了解决方案
RecyclerVIew auto scroll to display all the elements as in News Feed etc.,
如果一个单元格占据屏幕的整个宽度,则所有工作都很好,否则(如果每个单元格占据屏幕宽度的 95%),每次自动滑动都会将单元格放置在屏幕的开头(右侧),这是合乎逻辑的。因此,在一个可见单元格的末尾,它是另一个单元格的开始
看起来不太好。我需要这个单元格像这样位于屏幕中间。
我需要查看上一个单元格 - 当前单元格 - 下一个单元格
现在我想解释一些如何使当前平滑滚动的魔法(正如我在上面的链接中提到的)
我的CustomLinnearLayoutManager
中的这个方法
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position)
{
LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext())
{
@Override
public PointF computeScrollVectorForPosition(int targetPosition)
{
return SmoothLayoutManager.this.computeScrollVectorForPosition(targetPosition);
}
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics)
{
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
};
linearSmoothScroller.setTargetPosition(position);
startSmoothScroll(linearSmoothScroller);
}
但是这个方法无需偏移即可工作
我发现了另一种可以提供所需偏移量的方法
scrollToPositionWithOffset(final int position, final int offset)
它看起来正是我所需要的,但这种方法不需要平滑的动画。
所以,最终我的问题是:如何将动画逻辑从第一种方法应用到第二种方法(带有偏移量)
欢迎提问
最佳答案
要自动捕捉并在 RecyclerView
中心显示一项,您只需使用 LinearSnapHelper
即可,如下所示:
LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
如果您想以编程方式滚动到特定项目,LinearSnapHelper
也可以处理捕捉功能。
SmoothScroller smoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
@Override
protected int getVerticalSnapPreference() {
return LinearSmoothScroller.SNAP_TO_ANY;
}
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return 120f / displayMetrics.densityDpi;
}
};
...
smoothScroller.setTargetPosition(position);
recyclerView.getLayoutManager().startSmoothScroll(smoothScroller);
这是视觉结果:
.
......................手动滚动...................... ......以编程方式滚动............
关于java - 如何使用偏移 Recycler View 进行自动平滑滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52964701/