每次在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);
}
答案 0 :(得分:1)
这是一个更简单的黑客,可以在投掷事件中平滑滚动到某个位置:
@Override
public boolean fling(int velocityX, int velocityY) {
smoothScrollToPosition(position);
return super.fling(0, 0);
}
通过调用smoothScrollToPosition(int position)覆盖fling方法,其中" int position"是适配器中所需视图的位置。您需要以某种方式获得职位的价值,但这取决于您的需求和实施。