如何使用偏移回收器视图进行自动平滑滚动?

Ale*_*nko 1 java android android-recyclerview

有这样的问题,我有水平RecyclerView,每个单元格小于屏幕宽度。

所以我在这里找到了解决方案

RecyclerVIew 自动滚动以显示新闻提要等中的所有元素,

如果一个单元格占据屏幕的整个宽度,则所有工作都很好,否则(如果每个单元格占据屏幕宽度的 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);
}
Run Code Online (Sandbox Code Playgroud)

但是这种方法可以在没有偏移的情况下工作

我发现了另一种可以提供所需偏移量的方法

scrollToPositionWithOffset(final int position, final int offset)
Run Code Online (Sandbox Code Playgroud)

它看起来正是我所需要的,但是这种方法在没有平滑动画的情况下也能工作。

所以,最终我的问题是:如何将动画逻辑从第一种方法应用到第二种方法(带有偏移量)

随意问

ami*_*phy 6

要自动捕捉并在 中心显示一个项目RecyclerView,您只需使用LinearSnapHelper如下所示:

LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
Run Code Online (Sandbox Code Playgroud)

如果您想以编程方式滚动到特定项目,也可以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);
Run Code Online (Sandbox Code Playgroud)

这是视觉结果:
.

...................手动滚动................... 以编程方式滚动. …………

例子 例子