4

アプリを v1 Maps API から v2 API に移植していますが、マーカーに問題があります。

特定の地理的方向を指すマーカーが必要です。V1 では、描画時に正しい方向を指すビットマップを作成できましたが、V2 ではマーカー ビットマップを変更できません。

マップを回転させたときにすべてのマーカーを破棄して再構築するのが最善の方法なのか (これはパフォーマンスの問題のように思えます)、それともすべて自分で描画してみるのが最善の方法なのかはわかりません。これは、TileOverlay を介して、またはマップの上に座った独自のビューを介して行うことができます。

私はこれらのアプローチのどれもあまり好きではありません。誰かがそれらのいずれかを試しましたか?

アップデート:

独自のビューを使用して描画しようとしましたが、マップをドラッグしたときの遅延が大きすぎました。

現在、マーカーを破棄して再作成していますが、これは (予想どおり) パフォーマンスの問題であり、60 個のマーカーを更新するのに約 2000 ミリ秒かかります。

4

4 に答える 4

5

皆さんに朗報です!Google は Maps API にローテーションを追加したので、独自の実装を展開する必要はもうありません。

彼らはフラットマーカーも追加しましたが、これは元の質問により関連していると思います。平坦化されたマーカーは常に、最初にマップに描画された向きのままになります: https://developers.google.com/maps/documentation/android/marker#flatten_a_marker

唯一の要件は、Google Play Services の最新バージョンを参照することです。

于 2013-09-30T14:10:34.677 に答える
0

また、新しい API 用にアプリ (Runbot) を書き直しており、マイルストーン (1 km、2 km など) を表すカスタム マーカーを作成する方法と、ズームに応じてそれらのすべてを表示または表示しない方法を理解する必要がありました。レベル。v1 API に使用したカスタム ドローアブルがあり、マーカーをレンダリングするために今行っていることは次のとおりPositionです (位置と詳細情報を保持する独自のクラスです。ここで必要なのはそのLatLngプロパティだけです)。

private void addMarker(Position p, MilestoneDrawable milestone) {
    if (mMarkers.containsKey(p)) {
        mMarkers.get(p).setVisible(true);
    } else {
        Marker m = mMap.addMarker(new MarkerOptions()
            .position(p.latLng)
            .icon(BitmapDescriptorFactory.fromBitmap(Util.drawableToBitmap(milestone)))
            .anchor(0.5f, 1.0f) // bottom center
            );
        mMarkers.put(p, m);
    }
}

カスタム マーカーを作成して追加するだけでなく、マーカーを に保持しているHashMapので、マーカーを常に破棄して作成する必要はありません。ズームして表示するマーカーを決定するときは、まずすべてのマーカーを非表示に設定してから、addMarker()表示したいマーカーを呼び出し、既に持っているマーカーをHashMap再び表示します。

これが少し役立つことを願っています。私は新しい API に対して少し複雑な気持ちを持っています...

于 2013-01-18T10:03:46.187 に答える
0

メソッドを使用できませんaddMarker(new MarkerOptions())か?

カスタム マーカーが必要な場合は、次のように実装を作成してInfoWindowAdapter 使用 できます。mMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());

ここにInfoWindowAdapterのドキュメントがあります

于 2013-01-09T12:55:52.967 に答える
0

回転する必要があるマーカーがある場合、同様の問題がありました。私の解決策は、マーカーが表すオブジェクトにマーカーの生成を担当させることでした。オブジェクトには、次のようないくつかのメソッドがあります。

protected Marker getMarker(GoogleMap map) {
    if (this.marker == null) {
        marker = map.addMarker(new MarkerOptions().position(location).
            icon(BitmapDescriptorFactory.fromBitmap(BusMarkerImageFactory.
            getMarkerIcon(heading))));
    }
    return marker;
}

protected void updateMarker(GoogleMap map) {
    if (marker != null) {
        rotateIcon();
        marker.setPosition(location);
    } else {
        getMarker(map);
    }

private void rotateIcon() {
    marker.setIcon(BitmapDescriptorFactory.
        fromBitmap(BusMarkerImageFactory.getMarkerIcon(heading)));
}

これはバスが向かっている方向を指し示すマーカーでバスを描画するシステムからのものなので、もちろんコードは異なりますが、概念は非常に似ています。マーカー全体を再構築する代わりに、マーカーへの参照をどこかに保持してから、アイコンをリセットするだけです。

もちろん、小さな変更のためにこれらすべてのビットマップを描画することは、メモリを浪費します。(名前が間違っている) BusMarkerImageFactory で flyweight パターンを使用して、16 の可能な見出し範囲に対して 16 の画像を保持しました。これは、見出しを単純に受け取り、その範囲にマップした画像を返す静的クラスです。

于 2013-08-28T14:56:01.107 に答える