我有一个带有两个视图的简单应用程序,一个是 TableView,另一个是 ListView。我使用 GestureDetector 来检测屏幕上的滑动,类似于此处的操作。一切正常,如果列表视图只填充了几个项目,但是当 ListView 填满整个屏幕时,手势检测停止工作。在屏幕上滑动只会突出显示列表项之一。
我认为这是因为 ListView 以某种方式从 GestureListener 窃取了触摸事件。有没有办法防止这种情况?
我有一个带有两个视图的简单应用程序,一个是 TableView,另一个是 ListView。我使用 GestureDetector 来检测屏幕上的滑动,类似于此处的操作。一切正常,如果列表视图只填充了几个项目,但是当 ListView 填满整个屏幕时,手势检测停止工作。在屏幕上滑动只会突出显示列表项之一。
我认为这是因为 ListView 以某种方式从 GestureListener 窃取了触摸事件。有没有办法防止这种情况?
如果您遍历相当准确的水平路径,我发现 GestureDetector 在 ListItems 中可以正常工作。但是,如果您稍微偏离,列表会滚动并且手势不会完成。情况如下:
即使触摸稍微偏离水平方向,我也需要我的应用程序表现得好像水平滑动仍在继续。
解决方案:这涉及 ViewGroup.requestDisallowInterceptTouchEvent (boolean disallowIntercept),它阻止父级能够窥视运动事件。该方法涉及实现 onTouchListener 以检测轻微滑动(10 像素左右),然后停止父级拦截运动事件。然后父级将不会滚动,并且手势检测器会继续完成。
这是代码:
private boolean mFlingInProgress = false;
private float mStartX = 0;
private final int FLING_TRIGGER_DISTANCE = 10;
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
float currentX = event.getRawX();
switch (action) {
case MotionEvent.ACTION_DOWN:
mStartX = currentX;
break;
case MotionEvent.ACTION_MOVE:
if (false == mFlingInProgress) {
if (Math.abs(currentX - mStartX) > FLING_TRIGGER_DISTANCE) {
// stop the parent intercepting motion events
mLayout.getParent().requestDisallowInterceptTouchEvent(true);
mFlingInProgress = true;
}
}
break;
case MotionEvent.ACTION_UP:
mFlingInProgress = false;
break;
}
return mGestureDetector.onTouchEvent(event);
}
您可以创建一个自定义列表视图,然后在其中实现手势检测器,即在列表的每一行上。可能值得一试。