MapView坐标错误

问题描述:

当我在我的Android 2.2手机上使用ItemizedOverlay将引脚放置在MapView中时,位置是正确的,但是当我在4.0和4.1手机上使用它时,放置是错误的。该针脚放置在地图的下方,但具有相同的x坐标。MapView坐标错误

我发现4.XX设备上MapView左上角的像素值不是(0.0),因为它在我的2.2设备上。我可以看到不同之处在于操作栏的高度(如图中突出显示的高度),并找到了一些代码来获取它的高度。现在,放置引脚时,我从MapView中的y坐标中减去操作栏的高度。我在我的4.XX设备上得到了正确的结果,但现在我的2.2设备上的位置是错误的。

我在屏幕的顶部添加了一个,但它的高度在我的所有设备上都差不多。

你知道我应该怎么做才能在所有设备上的MapView中获得正确的坐标?

我使用的代码是:

final WindowManager w = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
final Display d = w.getDefaultDisplay(); 
final DisplayMetrics m = new DisplayMetrics(); 
d.getMetrics(m); 
int totalHeight =mapView.getLayoutParams().height; 
int statusbarHeight = totalHeight - mapView.getMeasuredHeight(); 

Example of action bar

我解决了这个问题,但它不是最漂亮的解决方案。

我检查操作栏的大小。如果存在,我运行问题中显示的代码。如果大小返回null,这意味着操作栏不存在,我不运行代码。

的代码是:

// Check if an action bar exist (Android 4.XX) 
private void getActionBarHeight() { 
    // TODO Auto-generated method stub 
    final WindowManager w = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
    final Display d = w.getDefaultDisplay(); 
    final DisplayMetrics m = new DisplayMetrics(); 
    d.getMetrics(m); 
    actionBarHeight = m.heightPixels; 

    try { // If the action bar exist 
     TypedValue tv = new TypedValue(); 
     context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true); 
     getResources().getDimensionPixelSize(tv.resourceId); 
    } catch (Exception e) { // If it doesn't exist 
     actionBarHeight = -1; 
    } 
} 

不清楚自己要去什么在这里,但如果你试图把图钉的地图上,然后你应该使用ItemizedOverlay,该地图采用纬度/经度坐标,而不是屏幕坐标。

有一个使用示例here。该代码展示了如何在地图上获取引脚,如何移动它们,以及如何在屏幕像素之间进行转换以及如何在纬线/经纬度上绘制地图,这些都在200行左右。