如何通过编程实现RecyclerView滚动指定像素?

5

我已经扩展了RecyclerView以便进行缩放。它按照我的预期工作,但现在我想要以编程方式滚动x个像素。这个功能的用户故事是,如果我点击屏幕的上半部分,它应该滚动x个像素,同样适用于屏幕的下半部分。

这是我所做的:

活动:

@Override
public boolean dispatchTouchEvent(MotionEvent event)
{
    // if(mComicViewerFragment != null)
    //     mComicViewerFragment.consumeEvent(event);

    mScaleDetector.onTouchEvent(event);

    if(event.getAction() == MotionEvent.ACTION_DOWN)
    {
        int y = (int) event.getY();

        if(y >= mScreenSize.y / 2)
        {
            mComicViewerFragment.scrollBy((int)(mScreenSize.y * 0.10f));
            Log.i(ComicApplication.TAG, "ComicViewerActivity.onTouchEvent : You are tapping the lower part : " + y);
        }
        else
        {
            mComicViewerFragment.scrollBy((int)(-mScreenSize.y * 0.10f));
            Log.i(ComicApplication.TAG, "ComicViewerActivity.onTouchEvent : You are tapping the upper part : " + y);
        }
    }

    return super.dispatchTouchEvent(event);
}

片段

public void scrollBy(int by)
{
    mScalingRecyclerView.smoothScrollBy(0, by);
}

每次我点击时,它不会按照x像素滚动。这是因为我创建了一个扩展自RecyclerView的自定义视图吗?我应该在哪里正确地调用smoothScrollBy?这应该很容易,但我卡住了。


1
不确定片段在RecyclerView中是否有不同的工作方式,但可以尝试此解决方案--https://dev59.com/B10a5IYBdhLWcg3wfY06 - Tasos
我不明白...这就是Google的臭名昭著之处。看看这个方法,它在说什么?smoothScrollBy。文档也很清楚:通过给定的像素量沿着任一轴动画滚动。但是它并没有做到!!! - Neon Warge
1
由于recycleView的项目被回收,无法按像素滚动,因此包含项目的屏幕的总高度始终相同,因此您需要进行一些数学计算来按位置滚动--在此处检查如何按像素滚动--https://blog.stylingandroid.com/scrolling-recyclerview-part-3/ --如果项目具有相等的高度,则会更准确。 - Tasos
@Tasos,你说得有道理!当然,我在想什么呢,recyclerview“回收”视图,只显示一些随着滚动而出现的项目。如果回收是基于像素而不是查询位置,那就不实用了。该死。我正在阅读第三部分提供的示例代码。非常感谢!我会将你的答案标记为正确的。 - Neon Warge
好的,谢谢。我会去做的。 - Tasos
显示剩余4条评论
1个回答

5

如果你的自定义视图中 recyclerView.smoothScrollBy(0, pixels); 不起作用,那么你可以尝试另一种替代方法。

你可以通过一些数学计算来按位置滚动,但它不会精确到像素。

假设你的项的高度相等为100dp,你可以通过代码将dp转换为任何屏幕类型的像素 见此处

假设100dp对应每个项的100px,你想向下滚动Recycler 400px。这是4个位置(400/100)。

然后你需要知道当前在视图中底部的项位置号,加上4并滚动或平滑滚动到该位置。

这里有一个帮助类,展示了如何获取视图中顶部或底部的项位置号,如果你想上下滚动Recycler都可以使用。

完整的解决方案请参考此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接