RecyclerView smoothScrollBy用于在fling手势上滚动内容

时间:2014-12-12 17:00:45

标签: android gesture android-recyclerview onfling

每次在Recycler View中检测到fling手势时,我想平滑滚动一个值,通常它是一个回收者视图的宽度(RecyclerView的getWidth)。

问题是通常使用onTouchEvent检测到fling,"拖动"按px的数量查看然后进行手势(smoothScrollBy),这意味着视图被px的数量过度滚动。

我试图检测那些px的值是什么,但似乎没有调用ACTION_DOWN所以我很难做到这一点。

我知道" smoothScrollToPosition",问题是每个项目可能有不同的宽度。

如何在不获取额外px的情况下弄清楚如何平滑滚动手势?

由于

@Override
public boolean fling(int velocityX, int velocityY) {
    Logger.d(TAG, "Fling");

    isFirstOnTouchEvent = true;

    Logger.d(TAG, "firstX: " + firstX + " lastX: " + lastX);
    Logger.d(TAG, "diff? " + (firstX - lastX));

    if(velocityX > 0) {
        smoothScrollBy(getWidth() - (int) (firstX - lastX), 0);
    } else {
        smoothScrollBy(-getWidth(), 0);
    }

    Logger.d(TAG, "\n\n\n");

    return true;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
    return super.onInterceptTouchEvent(e);
}

private boolean isFirstOnTouchEvent = true;
private double firstX;
private double lastX;

@Override
public boolean onTouchEvent(MotionEvent e) {
    Logger.d(TAG, "e: " + e.getAction() + " with raw x: " + e.getRawX() + " with x: " + e.getX());

    if(isFirstOnTouchEvent) {
        isFirstOnTouchEvent = false;

        firstX = e.getX();
    }

    lastX = e.getX();

    return super.onTouchEvent(e);
}

1 个答案:

答案 0 :(得分:1)

这是一个更简单的黑客,可以在投掷事件中平滑滚动到某个位置:

@Override
public boolean fling(int velocityX, int velocityY) {

    smoothScrollToPosition(position);
    return super.fling(0, 0);
}

通过调用smoothScrollToPosition(int position)覆盖fling方法,其中" int position"是适配器中所需视图的位置。您需要以某种方式获得职位的价值,但这取决于您的需求和实施。