0

Android 2.2電話でItemizedOverlayを使用してMapViewにピンを配置する場合、配置は正しいですが、4.0および4.1電話で配置する場合、配置が間違っています。ピンはマップのさらに下に配置されますが、x座標は同じです。

4.XXデバイスのMapViewの左上隅のピクセル値は、2.2デバイスの場合とは異なり、(0.0)ではないことがわかりました。違いはアクションバーの高さ(画像で強調表示されているものなど)であることがわかり、その高さを取得するためのコードが見つかりました。ここで、ピンを配置するときに、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();

アクションバーの例

4

2 に答える 2

1

ここで何をしようとしているのか正確にはわかりませんが、地図にピンを配置しようとしている場合は、画面座標ではなく、地図の緯度/経度座標を使用するItemizedOverlayを使用する必要があります。

ここに使用例があります。このコードは、地図上でピンを取得する方法、ピンを移動する方法、画面のピクセルと地図の緯度/経度を変換する方法をすべて最大200行で示しています。

于 2012-11-08T18:47:03.653 に答える
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;
    }
}
于 2012-11-09T12:48:06.143 に答える