Wie konzentriere ich mich auf den Standort auf Google Maps, wenn man bedenkt, dass eine Ansicht darüber steht?

Hintergrund

Angenommen, ich habe eine Google-Kartenansicht und eine weitere Ansicht darüber, die einen Teil davon abdeckt und einige Inhalte der Karte versteckt.

Das Problem

Ich muss die "kamera" der karte machen, fokussieren und eine markierung auf eine koordinate haben, aber lass es alle in der mitte des sichtbaren teiles der karte sein.

  • GridView inside Erweiterbare Liste in Android
  • Wie bekomme ich die aktuelle Netzwerknutzung von App (oder insgesamt), auch auf Android N?
  • Löschen von SharedPreferences-Datei
  • (Android Xamarin) Ressource Zeichenfolgenwert anstelle von int erhalten
  • Wie kann ich das Array der Klasse im GetMethodID-Methoden-Signatur-Parameter angeben?
  • Mit deinem eigenen XMPP Server für Android Chat App (Smack API)
  • Etwas wie das:

    Bildbeschreibung hier eingeben

    Der ursprüngliche Code konzentrierte sich auf (etwa) die Mitte des gesamten Bildschirms, so dass die Markierung fast unsichtbar (wie die untere Ansicht deckt es).

    Ding ist, ich kann nicht den richtigen Weg finden, um den richtigen Wert auf die Y-Koordinate der Karte selbst (dh Breitengrad) zu setzen.

    Was ich versucht habe

    Ich habe versucht, angesichts der Höhe der Unteransicht und der Koordinate, die ich den Marker aufgesetzt habe, um das Delta zu berechnen (noch nicht den Marker selbst ändern):

    final float neededZoom = 6.5f; int bottomViewHeight = bottomView.getHeight(); LatLng posToFocusOn = ...; final Point point = mMap.getProjection().toScreenLocation(posToFocusOn); final float curZoom = mMap.getCameraPosition().zoom; point.y += bottomViewHeight * curZoom / neededZoom; posToFocusOn = mMap.getProjection().fromScreenLocation(point); final CameraUpdate cameraPosition = CameraUpdateFactory.newCameraPosition(new Builder().target(posToFocusOn).zoom(neededZoom).build()); 

    Leider konzentriert sich das auf den Marker.

    Die Frage

    Was ist los mit dem, was ich geschrieben habe? Was kann ich tun, um es zu beheben?

  • Android Proguard, alle Log-Anweisungen entfernen und Pakete verschmelzen
  • Wie man android macht: background = "? Android: attr / selectableItemBackground Arbeit in API Ebene 8
  • Android.widget.TextView kann nicht auf android.view.ViewGroup geworfen werden
  • Android: Wie man Fragezeichen in einer String-Ressource?
  • Holen Sie sich die Liste der Abhängigkeiten Laufzeit
  • Holen Sie sich ein Integer-Array aus einer XML-Ressource im Android-Programm
  • 2 Solutions collect form web for “Wie konzentriere ich mich auf den Standort auf Google Maps, wenn man bedenkt, dass eine Ansicht darüber steht?”

    Ok, ich habe einen Workaround gefunden, den ich bei allen Geräten kenne (auf 3 getestet, jeweils mit einer anderen Bildschirmauflösung und Größe):

    Ich habe gemessen, wie viele Pixel (und dann in DP umgewandelt) eine Änderung von einem Grad auf den Marker selbst hat.

    Von hier aus maß ich die Höhe jeder Ansicht und berechnete das Delta, das benötigt wurde, um die Kamera zu bewegen.

    In meinem Fall ist es so (vorausgesetzt, der Zoom ist 6.5f):

      //measured as 223 pixels on Nexus 5, which has xxhdpi, so divide by 3 final float oneDegreeInPixels = convertDpToPixels( 223.0f / 3.0f); final float mapViewCenter = mapViewHeight / 2.0f; final float bottomViewHeight = ...; final float posToFocusInPixelsFromTop = (mapViewHeight - bottomViewHeight) / 2.0f ;// can optionally add the height of the view on the top area final float deltaLatDegreesToMove = (mapViewCenter - posToFocusInPixelsFromTop) / oneDegreeInPixels; LatLng posToFocusOn = new LatLng(latitude - deltaLatDegreesToMove, longitude); final CameraUpdate cameraPosition = CameraUpdateFactory.newCameraPosition(new Builder().target(posToFocusOn).zoom(neededZoom).build()); 

    Und es hat geklappt

    Ich frage mich, ob es angepasst werden kann, um jeden Wert des Zooms zu unterstützen.

    Ihr Code ist fast richtig, aber es geht über die Markierung, weil Sie unternehmen bottomViewHeight bei der Berechnung von point.y anstelle von bottomViewHeight/2 (Wenn die Größe Ihrer Ansicht 200px ist, müssen Sie nur die Karte 100px verschieben, um es erneut zu verschieben):

     point.y += (bottomViewHeight / 2) * curZoom / neededZoom; 

    Aktualisieren:

    Dies ist ein allgemeiner Ansatz, der die Kartengrenzen berücksichtigt und eine neue Kartengrenze entsprechend der Höhe Ihres bottomView . Das ist zoomunabhängig.

     public void recenter() { LatLngBounds mapBounds = mMap.getProjection().getVisibleRegion().latLngBounds; Point nothEastPoint = mMap.getProjection().toScreenLocation(mapBounds.northeast); Point souhWestPoint = mMap.getProjection().toScreenLocation(mapBounds.southwest); Point newNorthEast = new Point(nothEastPoint.x, nothEastPoint.y + bottomView.getHeight() / 2); Point newSouhWestPoint = new Point(souhWestPoint.x, souhWestPoint.y + bottomView.getHeight() / 2); LatLngBounds newBounds = LatLngBounds.builder() .include(mMap.getProjection().fromScreenLocation(newNorthEast)) .include(mMap.getProjection().fromScreenLocation(newSouhWestPoint)) .build(); mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(newBounds, 0)); } 

    Beachten Sie, dass bei jedem Aufruf von recenter() die Karte verschoben wird.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.