Es kann losgehen!

Bevor Sie mit der Entwicklung beginnen, lesen Sie bitte unsere Entwicklerdokumentation.

Die Google Maps Android API aktivieren

Zum Einstieg führen wir Sie durch die Google Developers Console, wo Sie vorab Folgendes tun müssen:

  1. Ein Projekt erstellen oder auswählen
  2. Die Google Maps Android API aktivieren
  3. Zugehörige Schlüssel erstellen
Weiter

Marker

Standorte auf der Karte werden mithilfe von Markern angezeigt. Sie können Ihre Marker anpassen, indem Sie die Standardwerte für die Farbe ändern oder das Marker-Icon durch ein benutzerdefiniertes Bild ersetzen. Info-Fenster können verwendet werden, um zusätzliche Kontextinformationen zum Marker anzugeben.

Codebeispiele

Das ApiDemos-Repository auf GitHub enthält ein Beispiel, in dem verschiedene Markerfunktionen demonstriert werden:

Einführung

Standorte auf der Karte werden mithilfe von Markern angezeigt. Für den Standardmarker wird ein Standardsymbol verwendet, das den Benutzern aus Google Maps bekannt ist. Es ist möglich, die Farbe des Icons, das Bild oder den Anker mithilfe der API zu ändern. Marker haben den Objekttyp Marker; sie werden mithilfe der Methode GoogleMap.addMarker(markerOptions) zur Karte hinzugefügt.

Marker sind interaktiv. Sie erhalten standardmäßig click-Ereignisse und werden häufig in Verbindung mit Event-Listeners eingesetzt, um Info-Fenster aufzurufen. Indem Sie die Markereigenschaft draggable auf true setzen, können Benutzer die Position des Markers verändern. Über langes Drücken können Sie das Verschieben des Markers aktivieren.

Standardmäßig wird beim Antippen eines Markers die Kartensymbolleiste unten rechts auf der Karte angezeigt, um dem Benutzer das schnelle Aufrufen der mobilen Google Maps-App zu ermöglichen. Sie können diese Symbolleiste deaktivieren. Weitere Informationen finden Sie in der Dokumentation zu Steuerelementen.

Erste Schritte mit Markern

Diese Maps Live-Episode umfasst die Grundlagen zum Hinzufügen von Markern zu Ihrer Karte mithilfe von Google Maps Android API.

Marker hinzufügen

Im folgenden Beispiel wird ein Marker zu einer Karte hinzugefügt: Der Marker wird an den Koordinaten 10,10 erstellt und zeigt, wenn er angeklickt wird, die Zeichenfolge „Hello world“' in einem Info-Fenster an.

@Override
public void onMapReady(GoogleMap map) {
    map.addMarker(new MarkerOptions()
        .position(new LatLng(10, 10))
        .title("Hello world"));
}

Zusätzliche Informationen zu einem Marker anzeigen

Eine gängige Anforderung ist das Anzeigen zusätzlicher Informationen über einen Ort oder einen Standort, wenn der Nutzer auf einen Marker auf der Karte tippt. Weitere Informationen finden Sie im Leitfaden für Info-Fenster.

Daten mit einem Marker verknüpfen

Sie können ein beliebiges Datenobjekt unter Verwendung von Marker.setTag() mit einem Marker speichern und das Datenobjekt mithilfe von Marker.getTag() abrufen, wie im folgenden Codebeispiel gezeigt wird:

/**
 * A demo class that stores and retrieves data objects with each marker.
 */
public class MarkerDemoActivity extends FragmentActivity implements
        OnMarkerClickListener,
        OnMapReadyCallback {

    private static final LatLng PERTH = new LatLng(-31.952854, 115.857342);
    private static final LatLng SYDNEY = new LatLng(-33.87365, 151.20689);
    private static final LatLng BRISBANE = new LatLng(-27.47093, 153.0235);

    private Marker mPerth;
    private Marker mSydney;
    private Marker mBrisbane;

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.marker_demo);

        SupportMapFragment mapFragment =
                (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    /** Called when the map is ready. */
    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;

        // Add some markers to the map, and add a data object to each marker.
        mPerth = mMap.addMarker(new MarkerOptions()
                .position(PERTH)
                .title("Perth");
        mPerth.setTag(0);

        mSydney = mMap.addMarker(new MarkerOptions()
                .position(SYDNEY)
                .title("Sydney");
        mSydney.setTag(0);

        mBrisbane = mMap.addMarker(new MarkerOptions()
                .position(BRISBANE)
                .title("Brisbane");
        mBrisbane.setTag(0);

        // Set a listener for marker click.
        mMap.setOnMarkerClickListener(this);
    }

    /** Called when the user clicks a marker. */
    @Override
    public boolean onMarkerClick(final Marker marker) {

        // Retrieve the data from the marker.
        Integer clickCount = (Integer) marker.getTag();

        // Check if a click count was set, then display the click count.
        if (clickCount != null) {
            clickCount = clickCount + 1;
            marker.setTag(clickCount);
            Toast.makeText(this,
                           marker.getTitle() +
                           " has been clicked " + clickCount + " times.",
                           Toast.LENGTH_SHORT).show();
        }

        // Return false to indicate that we have not consumed the event and that we wish
        // for the default behavior to occur (which is for the camera to move such that the
        // marker is centered and for the marker's info window to open, if it has one).
        return false;
    }
}

Nachfolgend sind einige Beispiele für Szenarios aufgeführt, in denen es nützlich ist, Daten mit Markern zu speichern und abzurufen:

  • Ihre App deckt möglicherweise verschiedene Typen von Markern ab und Sie möchten diese unterschiedlich behandeln, wenn der Nutzer darauf klickt. Um dies zu erreichen, können Sie zusammen mit dem Marker einen String speichern, der den Typ angibt.
  • Sie verfügen möglicherweise über eine Schnittstelle mit einem System, in dem es eindeutige Datensatzbezeichner gibt, wobei die Marker bestimmte Datensätze in diesem System darstellen.
  • Mithilfe von Markerdaten kann eine zu verwendende Priorität angegeben werden, wenn über den z-Index eines Markers entschieden wird.

Ziehen von Markern ermöglichen

Sie können die Position eines Markers nach dem Hinzufügen zur Karte verändern, sofern die Markereigenschaft draggable auf true gesetzt ist. Drücken Sie lang auf den Marker, um das Ziehen zu aktivieren. Wenn Sie den Finger vom Bildschirm nehmen, bleibt der Marker in dieser Position.

Standardmäßig können Marker nicht gezogen werden. Sie müssen explizit festlegen, dass es möglich sein soll, den Marker zu ziehen; entweder mit MarkerOptions.draggable(boolean), bevor Sie den Marker zur Karte hinzufügen, oder mit Marker.setDraggable(boolean), nachdem der Marker zur Karte hinzugefügt wurde. Sie können auf Zieh-Ereignisse des Markers warten, wie unter Zieh-Ereignisse für Marker erläutert.

Mit dem nachfolgenden Codeausschnitt wird ein ziehbarer Marker an der Position von Perth, Australien, hinzugefügt.

static final LatLng PERTH = new LatLng(-31.90, 115.86);
Marker perth = mMap.addMarker(new MarkerOptions()
                          .position(PERTH)
                          .draggable(true));

Marker anpassen

Im nachfolgenden Video sehen Sie, wie Marker zur Darstellung von Standorten auf einer Karte verwendet werden können.

Sie können festlegen, dass für einen Marker ein benutzerdefiniertes Bild anstelle des Standard-Icons angezeigt wird. Um ein Icon zu definieren, müssen Sie verschiedene Eigenschaften festlegen, mit denen das Anzeigeverhalten eines Markers beeinflusst wird.

Die Anpassung folgender Eigenschaften wird von Markern unterstützt:

Position (Erforderlich)
Der Wert LatLng für die Markerposition auf der Karte. Dies ist die einzige erforderliche Eigenschaft für ein Objekt Marker.
Anchor
Der Ankerpunkt des Bildes, der an der Position „LatLng“ des Markers positioniert wird. Standardmäßig ist dies die untere Mitte des Bildes.
Alpha
Definiert die Deckkraft des Markers. Der Standardwert ist 1,0.
Title
Eine Zeichenfolge, die im Info-Fenster angezeigt wird, wenn der Benutzer auf den Marker tippt.
Snippet
Zusätzlicher Text, der unterhalb des Titels angezeigt wird.
Icon
Ein Bitmap, das anstelle des Markerstandardbilds angezeigt wird.
Draggable
Setzen Sie diese Eigenschaft auf true, wenn der Benutzer in der Lage sein soll, den Marker zu verschieben. Der Standardwert ist false.
Visible
Setzen Sie diese Eigenschaft auf false, um den Marker auszublenden. Der Standardwert ist true.
Ausrichtung „Flat“ oder „Billboard“
Standardmäßig sind Marker am Bildschirm ausgerichtet und werden nicht mit der Kamera gedreht oder geneigt. Flache Marker sind an der Erdoberfläche ausgerichtet und werden nicht mit der Kamera gedreht oder geneigt. Beide Markertypen verändern ihre Größe nicht abhängig von der Vergrößerungsstufe. Wenn Sie diesen Effekt wünschen, verwenden Sie „GroundOverlays“.
Rotation
Die Ausrichtung des Markers, angegeben in Grad im Uhrzeigersinn. Die Standardposition ändert sich, wenn der Marker flach ist. Standardmäßig ist ein flacher Marker nach Norden ausgerichtet. Ist der Marker nicht flach, zeigt er in der Standardposition nach oben, und die Rotation erfolgt so, dass der Marker immer zur Kamera zeigt.

Im nachfolgenden Codeausschnitt wird ein einfacher Marker mit Standardsymbol erstellt.

static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE));

Markerfarbe anpassen

Sie können die Farbe eines Markerstandardbilds anpassen, indem Sie ein Objekt BitmapDescriptor zur Methode „icon()“ hinzufügen. Sie können verschiedene vordefinierte Farben im Objekt BitmapDescriptorFactory verwenden oder eine benutzerdefinierte Markerfarbe mit der MethodeBitmapDescriptorFactory.defaultMarker(float hue) festlegen. Der Farbton ist ein Wert zwischen 0 und 360, der für die Punkte auf einem Farbkreis steht.

static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

Markerdeckkraft anpassen

Sie können die Deckkraft eines Markers mithilfe der Methode „MarkerOptions.alpha()“ anpassen. „Alpha“ wird als Gleitkommawert zwischen 0,0 und 1,0 angegeben, wobei 0 vollständig transparent und 1 vollständig deckend bedeutet.

static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .alpha(0.7f));

Markerbild anpassen

Sie können das Markerstandardbild durch ein benutzerdefiniertes Markerbild, auch als Icon bezeichnet, ersetzen. Benutzerdefinierte Icons werden immer als BitmapDescriptor gesetzt und mithilfe einer der Methoden in der Klasse BitmapDescriptorFactory definiert.

fromAsset(String assetName)
Erstellt einen benutzerdefinierten Marker unter Verwendung des Namens einer Bitmap-Grafik im Anlagenverzeichnis.
fromBitmap(Bitmap image)
Erstellt einen benutzerdefinierten Marker aus einer Bitmap-Grafik.
fromFile(String fileName)
Erstellt ein benutzerdefiniertes Icon unter Verwendung des Namens einer Bitmap-Bilddatei, die sich im internen Speicher befindet.
fromPath(String absolutePath)
Erstellt einen benutzerdefinierten Marker anhand eines absoluten Dateipfads eines Bitmap-Bildes.
fromResource(int resourceId)
Erstellt einen benutzerdefinierten Marker unter Verwendung der Ressourcen-ID eines Bitmap-Bildes.

Im nachfolgenden Codeausschnitt wird ein Marker mit einem benutzerdefinierten Icon erstellt.

  private static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
  private Marker melbourne = mMap.addMarker(new MarkerOptions()
                            .position(MELBOURNE)
                            .title("Melbourne")
                            .snippet("Population: 4,137,400")
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));

Marker vereinfachen

Marker-Icons werden normalerweise mit Bezug zum Bildschirm gezogen; das Drehen, Neigen oder Vergrößern der Karte verändert die Ausrichtung des Markers nicht. Sie können die Ausrichtung eines Markers so festlegen, dass dieser flach auf der Erdoberfläche liegt. Auf diese Weise ausgerichtete Marker drehen sich, wenn die Karte gedreht wird, und verändern die Perspektive, wenn die Karte geneigt wird. Flache Marker behalten ihre Größe bei, wenn die Karte vergrößert oder verkleinert wird.

Um die Ausrichtung des Markers zu ändern, setzen Sie die Markereigenschaft flat auf true.

static final LatLng PERTH = new LatLng(-31.90, 115.86);
Marker perth = mMap.addMarker(new MarkerOptions()
                          .position(PERTH)
                          .flat(true));

Marker drehen

Sie können einen Marker mithilfe der Methode Marker.setRotation() um seinen Ankerpunkt drehen. Die Drehung wird in Grad im Uhrzeigersinn, ausgehend von der Standardposition gemessen. Wenn der Marker flach auf der Karte liegt, ist Norden die Standardposition. Ist der Marker nicht flach, zeigt er in der Standardposition nach oben, und die Rotation erfolgt so, dass der Marker immer zur Kamera zeigt.

Im nachfolgenden Beispiel wird der Marker um 90 ° gedreht. Indem Sie den Ankerpunkt auf 0.5,0.5 setzen, wird der Marker um seine Mitte und nicht mehr um seine Grundlinie gedreht.

static final LatLng PERTH = new LatLng(-31.90, 115.86);
Marker perth = mMap.addMarker(new MarkerOptions()
                          .position(PERTH)
                          .anchor(0.5,0.5)
                          .rotation(90.0));

z-Index des Markers

Der z-Index gibt die Stapelreihenfolge dieses Markers relativ zu anderen Markern auf der Karte an. Ein Marker mit einem hohen z-Index wird über Markern mit niedrigerem z-Index gezeichnet. Der standardmäßige z-Indexwert ist 0.

Legen Sie den z-Index für das Optionsobjekt des Markers fest, indem Sie MarkerOptions.zIndex() aufrufen, wie im folgenden Codeausschnitt gezeigt wird:

@Override
public void onMapReady(GoogleMap map) {
    map.addMarker(new MarkerOptions()
        .position(new LatLng(10, 10))
        .title("Marker z1")
        .zIndex(1.0f));
}

Sie können auf den z-Index des Markers zugreifen, indem Sie Marker.getZIndex() aufrufen, und Sie können diesen ändern, indem Sie Marker.setZIndex() aufrufen.

Marker werden immer über den Kachelebenen und andere Überlagerungen, die keine Marker sind (Geländeüberlagerungen, Polylinien, Polygone und andere Formen), gezeichnet, und zwar unabhängig vom z-Index der anderen Überlagerungen. Tatsächlich wird davon ausgegangen, dass sich Marker in einer eigenen z-Indexgruppe verglichen mit anderen Überlagerungen befinden.

Informationen zur Auswirkung des z-Index auf Klickereignisse finden Sie weiter unten.

Markerereignisse verarbeiten

Mit der Maps API können Sie Marker auf Markerereignisse warten und reagieren lassen. Um Reaktionen auf diese Ereignisse zu ermöglichen, müssen Sie den entsprechenden Listener im Objekt GoogleMap , zu dem Ihr Marker gehört, einrichten. Wenn das Ereignis an einem der Marker auf der Karte erfolgt, wird der Callback des Listeners durch das entsprechende Objekt Marker, das als Parameter weitergegeben wird, aktiviert. Um dieses Objekt Marker mit Ihrer eigenen Referenz auf ein Objekt Marker zu vergleichen, müssen Sie equals() anstelle von == verwenden.

Reaktionen auf folgende Ereignisse sind möglich:

Marker-Klickereignisse

Sie können einen Listener OnMarkerClickListener verwenden, um auf Klickereignisse zum Marker zu warten. Um diesen Listener auf der Karte einzurichten, rufen Sie GoogleMap.setOnMarkerClickListener(OnMarkerClickListener) auf. Wenn ein Benutzer auf einen Marker klickt, wird onMarkerClick(Marker) aufgerufen, und der Marker wird als Argument übergeben. Bei dieser Methode wird ein Boolescher Wert zurückgegeben, der angibt, ob Sie das Ereignis verbraucht haben (d. h., sie möchten das Standardverhalten unterdrücken). Wird der Wert false zurückgegeben, wird das Standardverhalten zusätzlich zum benutzerdefinierten Verhalten gezeigt. Das Standardverhalten für ein Marker-Klickereignis ist die Anzeige des zugehörigen Info-Fensters (sofern vorhanden) sowie das Verschieben der Kamera, sodass sich der Marker in der Mitte der Karte befindet.

Auswirkung des z-Index auf Klickereignisse:

  • Wenn ein Nutzer auf einen Marker-Cluster klickt, wird das Klickereignis für den Marker mit dem höchsten z-Index ausgelöst.
  • Pro Klick wird maximal ein Ereignis ausgelöst. Das heißt, der Klick wird nicht an die Marker oder anderen Überlagerungen mit niedrigeren z-Index-Werten weitergegeben.
  • Wenn auf einen Marker-Cluster geklickt wird, führt dies dazu, dass nachfolgende Klicks den Cluster durchlaufen, wobei ein Marker nach dem anderen ausgewählt wird. Bei der Reihenfolge im Zyklus hat zunächst der z-Index Priorität, dann die Nähe zum nächsten Klickpunkt.
  • Wenn der Nutzer auf eine Stelle außerhalb des Umkreises des Clusters klickt, berechnet die API den Cluster neu und setzt den Status des Klickzyklus zurück, sodass er wieder am Anfang beginnt.
  • Das Klickereignis durchläuft Marker-Cluster bis zu anderen Formen und Überlagerungen, bevor der Zyklus erneut gestartet wird.
  • Tatsächlich wird davon ausgegangen, dass sich Marker in einer eigenen z-Indexgruppe, verglichen mit anderen Überlagerungen oder Formen (Polylinien, Polygone, Kreise und/oder Geländeüberlagerungen), befinden, und zwar unabhängig von dem z-Index der anderen Überlagerungen. Wenn mehrere Marker, Überlagerungen oder Formen einander überlagern, wird das Klickereignis zunächst durch den Marker-Cluster geführt. Anschließend wird es nacheinander für andere anklickbare Überlagerungen oder Formen ausgelöst (entsprechend deren z-Index-Werten).

Marker-Zieh-Ereignisse

Sie können einen Listener OnMarkerDragListener verwenden, um auf Zieh-Ereignisse an einem Marker zu warten. Um diesen Listener auf der Karte einzurichten, rufen Sie GoogleMap.setOnMarkerDragListener auf. Um einen Marker zu ziehen, muss der Benutzer das Ziehen durch langes Drücken auf den Marker aktivieren. Wenn der Benutzer den Finger vom Bildschirm nimmt, bleibt der Marker in dieser Position. Wenn ein Marker gezogen wird, erfolgt zunächst der Aufruf von onMarkerDragStart(Marker). Während der Marker gezogen wird, erfolgt durchgängig der Aufruf von onMarkerDrag(Marker). Am Ende des Ziehvorgangs wird onMarkerDragEnd(Marker) aufgerufen. Sie können die Position des Markers jederzeit anfordern, indem Sie Marker.getPosition() aufrufen.

Hinweis: Standardmäßig können Marker nicht gezogen werden. Sie müssen explizit angeben, dass es möglich sein soll, den Marker zu ziehen, bevor ein Benutzer ihn ziehen kann. Dies ist entweder mit MarkerOptions.draggable(boolean) vor dem Hinzufügen zur Karte oder mit Marker.setDraggable(boolean), nachdem der Marker zur Karte hinzugefügt wurde, möglich.

Feedback geben zu...

Google Maps Android API
Google Maps Android API