MapView坐标错误

时间:2012-11-08 18:04:07

标签: android google-maps android-mapview mapactivity

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

我发现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

2 个答案:

答案 0 :(得分:1)

不完全确定你在这里要做什么,但是如果你想把针放在地图上,那么你应该使用ItemizedOverlay,它需要地图的lat / lon坐标,而不是屏幕坐标。

有一个用法示例here。该代码显示了如何在地图上获取引脚,如何移动它们,以及如何在屏幕像素和地图lat / lon之间进行转换,所有这些都在~200行内。

答案 1 :(得分:0)

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

我检查操作栏的大小。如果存在,我运行问题中显示的代码。如果大小返回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;
    }
}