2016-07-12 1 views
2

Ich versuche einen Weg zu finden, meine Kartenmarkierung in meiner Kartenfragmentaktivität zu zentrieren. Bisher habe ich versucht, jedes Mal, wenn die Karte bewegt wird, einen Marker in die Mitte des Bildschirms zu setzen, d. H. Die Kameraposition wird aktualisiert. Aber das Problem mit dieser Lösung ist, dass jedes Mal, wenn ein neuer Marker in die Karte in der Mitte hinzugefügt wird und der alte dort bleibt, so würde ich in nur ein paar Zügen 10 Marker auf meinem Bildschirm haben. Ich habe versucht, die Clear-Methode zu verwenden, bevor ich den nächsten Marker hinzufüge, aber jetzt blinkt der Marker zu sehr. Hier ist mein Code:Wie wird die Kartenmarkierung immer in der Mitte des Bildschirms gehalten? Android

mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
      @Override 
      public void onCameraChange(CameraPosition cameraPosition) { 
       LatLng location=mMap.getCameraPosition().target; 
       MarkerOptions marker=new MarkerOptions().position(location).title(""); 
       mMap.clear(); 
       mMap.addMarker(marker); 
       mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 16)); 
      } 
     }); 

Die andere Lösung, die ich gefunden habe, ist eine zentrierte Image zu verwenden, aber das Problem mit diesem ist, dass ich das Symbol meiner Markierung ändern möchten. Aber wenn ich ein image Bild zur Bildansicht hinzufüge, ist die Mitte der Kamera im grünen kleinen Kreis in der Mitte dieses Bildes und nicht das spitze Ende davon, wie ich will. Bitte helfen Sie.

+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/36157242/pinch-to-zoom-google-map-with-out-moving-marker-in-framelayout/36287722#36287722 – antonio

+0

Es tut mir leid Aber kannst du klären, wie genau ich das AnchoredImageView verwenden kann? Ich habe es als Java-Klasse im Verzeichnis src/main/hinzugefügt, aber was nun? –

+0

Jetzt müssen Sie Ihre Layout-XML wie im Beispiel und als der Rest des Codes auf Ihrer Aktivität – antonio

Antwort

2

Verwenden Sie keinen echten Marker. Setzen Sie die MapFragment oder in ein Layout mit einem falschen Marker Bild zentriert über. Wenn der Ort ausgewählt ist, platziere einen echten Marker und verstecke den falschen.

Wenn das "spitze Ende" des falschen Markerbildes nicht genau in der Mitte liegt, füllen Sie das Bild einfach mit transparentem Raum auf, bis es ist.

+0

hye Kevin bearbeiten, können Sie mir Link Code für diese Erklärung geben? :) –

0

Angenommen, Sie verwenden Google Play-Dienste für unter Standort des Benutzers Anruf bekommen von

@Override 
    public void onConnected(Bundle connectionHint) { 
     Log.i(TAG, "Connected to GoogleApiClient"); 

     // If the initial location was never previously requested, we use 
     // FusedLocationApi.getLastLocation() to get it. If it was previously requested, we store 
     // its value in the Bundle and check for it in onCreate(). We 
     // do not request it again unless the user specifically requests location updates by 
     // pressing 
     // the Start Updates button. 
     // 
     // Because we cache the value of the initial location in the Bundle, it means that if the 
     // user launches the activity, 
     // moves to a new location, and then changes the device orientation, the original location 
     // is displayed as the activity is re-created. 
     if (mCurrentLocation == null) { 
      mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
      drawOnMap(new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude())); 
     } 
    } 

Und

/** 
    * Callback that fires when the location changes. 
    */ 
    @Override 
    public void onLocationChanged(Location location) { 
     mCurrentLocation = location; 
     if (location != null) { 
      drawOnMap(new LatLng(location.getLatitude(), location.getLongitude())); 
     } 
    } 

Dies wird die Funktion zum Aktualisieren Markierung auf der Karte sein.

public void drawOnMap(final LatLng location) { 
     if (isFirstLocation) { 
      markerCurrent = mMap.addMarker(new MarkerOptions() 
        .position(location) 
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.dot))); 
      isFirstLocation = false; 
     } else { 
      markerCurrent.setPosition(location); 
     } 
     CameraPosition cp = getCameraPosition(location); 
     int animationDuration = 600; 
     mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cp), animationDuration, null); 
    } 
1

Ja, eigentlich können Sie setOnCameraChangeListener verwenden. Sie müssen also nicht jedes Mal den Marker löschen, sondern nur eine neue Position festlegen. Versuchen Sie diesen Code:

map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
    @Override 
    public void onCameraChange(CameraPosition cameraPosition) 
    { 
     if(marker==null) 
     { 
      marker = map.addMarker(new MarkerOptions().position(cameraPosition.target).title("Marker") 
        .icon(BitmapDescriptorFactory.fromResource(R.mipmap.marker))); 
      marker.showInfoWindow(); 
     } 
     else 
     { 
      marker.setPosition(cameraPosition.target); 
     } 
    } 
}); 

Dies sollte funktionieren. Das einzige Problem ist, dass sich der Marker erst am Ende der Kartenverschiebung in die Mitte der Karte bewegt. Um dieses Problem zu vermeiden, können Sie einfach etwas wie ImageView verwenden und es in der Mitte Ihres Kartenfragments einfügen. Danach können Sie den obigen Code mit nur hinzufügen:

marker.setVisible (false);