我有一个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
时起作用。但这也没有产生任何明显的改进。我还注意到这些方法在某种程度上也取决于压力。当我轻轻地滑动时,什么也没发生。而同样的事情,如果加大压力并按同样的路径滑动,就会产生滚动。
是否有办法使滚动平稳,即使滑动的路径不是水平直线,甚至如果运动是圆形的?感激不尽任何帮助。