У меня есть ListView
, каждый из элементов которого является горизонтальным RecyclerView
. Проблема, с которой я столкнулась, - горизонтальный свиток не очень гладкий. Если я прокручиваю/прокручиваю в совершенно горизонтальном направлении, то он отлично работает, но если свиток даже слегка не горизонтальный (скажем, под углом 10 градусов к горизонтали), он считает, что в качестве прокрутки вверх/вниз, а не влево/вправо, из-за родителя ListView
. Я пробовал этот метод:
recyclerView.setOnTouchListener(new FlingRecyclerView.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
Log.i("Scroll down", "Intercept true");
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_MOVE:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
// Handle HorizontalScrollView touch events.
v.onTouchEvent(event);
return true;
}
});
Но это было не очень эффективно. На самом деле я не мог заметить большого улучшения. Это потому, что этот motionEvent вызывается только тогда, когда движение совершенно горизонтально - этот случай уже работает нормально. Затем я попытался сделать это:
class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
Log.i("TAG", "VelocityX " + Float.toString(velocityX) + "VelocityY " + Float.toString(velocityY));
Log.i("TAG", "e1X " + Float.toString(e1.getX()) + "e1Y " + Float.toString(e1.getY()) + "e2X " + Float.toString(e2.getX()) + "e2Y " + Float.toString(e2.getY()));
// downward swipe
if (e2.getY() - e1.getY() > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Downward Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Downward swipe");
}
else if (e1.getY() - e2.getY() > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Upward Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Upward swipe");
}
// right to left swipe
else if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Left swipe");
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Right swipe");
}
} catch (Exception e) {
// nothing
}
return false;
}
}
И я заметил, что он регистрирует события только тогда, когда я отпускаю палец, а не когда я начинаю салфетки. Он не работает, как только я касаюсь RecyclerView
. И это тоже не привело к заметному улучшению. Я также заметил, что эти методы так или иначе зависят от давления. Когда я сделал легкий удар, ничего не случилось. То же самое делается на том же пути, при большем давлении производит свиток.
Есть ли способ сделать прокрутку гладкой, даже если путь салфетки не является горизонтально прямой или даже если движение является типом циркуляра? Любая помощь будет высоко оценен.