为什么onTouchEvent的返回值会导致应用程序崩溃或冻结mapView?

时间:2011-10-10 13:26:35

标签: android google-maps-api-3

我正在使用谷歌地图应用程序,用户可以触摸地图并在地图上标记起点和终点。然后在地图上绘制连接两点的路径。 为了处理触摸事件,我在MapOverlay类中实现了onTouchEvent方法。 我观察到地图有些奇怪的行为。当用户获得连接两个点的路径时,地图会冻结,即我无法平移或缩放地图。 我发现如果在MapOverlay方法内的onTouchEvent中返回值为true,则地图在上述情况下冻结。如果我返回false,那么map将不会冻结。但是,如果我想再次在地图上标记新点,应用程序崩溃... onTouchEvent的返回值如何与此行为相关?

2 个答案:

答案 0 :(得分:1)

如果返回true,则处理程序告诉系统它处理了onTouchEvent并且系统不会调用另一个onTouchListener。如果返回false,则告诉系统,您没有处理触摸事件,它将调用基础视图的onTouchListener。您的地图不会冻结,但它不会获得任何触摸事件,因为您的处理程序会处理它们。

答案 1 :(得分:1)

onTouchEvent()甚至可行的方式是,如果您返回true,则表示触摸事件已处理,Android将不会继续沿视图层次结构处理触摸事件。如果您返回false,它将继续。

在这种情况下,当您总是返回true时,您总是说触摸事件已被处理。因此,您所做的任何手势都将永远无法处理,因为您说它已经处理过了。因此,看起来地图冻结了。相反,提出这样的条件:

@Override
public boolean onTouchEvent(MotionEvent event){
   boolean wasHandled = false;
   if(/* condition where your touch event was handled */)
      wasHandled = true;
   else
      wasHandled = super.onTouchEvent(event);

   return wasHandled;
}

当你返回false时它崩溃的原因是程序中的一个问题,或者它进入一个循环,因为事件从未被处理过。