Я работаю над приложением, которое выглядит примерно так:
RecyclerView использует пользовательский LayoutManager с пользовательской реализацией «scrollVerticallyBy».
Первый из. Масло прокрутки recyclerview гладкое и рендерится быстрее, чем требуемые 16 мс. Я думаю, что могу максимизировать около 5 мс на Nexus 5.
Однако я также хочу иметь возможность прокручивать RecyclerView, касаясь представления над ним (это RelativeLayout).
Вот проблема:
1) Если я просто перешлю onTouchEvents, прокрутка будет гладкой. Однако RecyclerView.fling(...) никогда не вызывается, и прокрутка работает только до тех пор, пока палец касается экрана. Нет швыряния, что очень неловко.
@Override
public boolean onTouchEvent(MotionEvent event) {
return mRecyclerView.onTouchEvent(event);
}
2) Если я переопределяю .fling(...) в RecyclerView, я могу заставить работать "fling" с помощью Scroller. Это работает, но вызывает некоторые странные большие задержки.
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mScroller.computeScrollOffset()) {
Log.d("RecyclerView", "(ondraw) Y: " + mScroller.getCurrY());
scrollBy(0, mScroller.getCurrY()- mLastY);
mLastY = mScroller.getCurrY();
postInvalidateDelayed(16); // 60 Hz
}
}
@Override
public boolean fling(int velocityX, int velocityY) {
mLastY = 0;
mScroller.fling(0, 0, velocityX, velocityY, 0, 0, -10000 ,10000);
return true;
}
Я не уверен, как правильно это сделать. Мне кажется, что если я не переопределяю .fling() и заставляю свое приложение многократно вызывать scrollBy() с помощью Scroller, прокрутка работает по-другому.
Я подозреваю, что это может иметь какое-то отношение к «startSmoothScroll» и «smoothScrollToPosition», которые я не перезаписал. Честно говоря, я не знаю, что такое плавная прокрутка, но это звучит актуально для этой проблемы :)