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.

  • Erstellen einer DialogPreference aus XML
  • Was ist die Funktion und der Nutzen von Context: <no context> in AndroidStudio?
  • Mehrzeilige in EditText-Ansicht in Android zulassen?
  • Android + gradle: verschiedene manifest meta-data pro Geschmack
  • Verwenden Sie die onPostCreate () - Methode?
  • Öffnen Sie lokale Html-Datei in Webview - Android
  • 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?

  • Wie kann man benutzerdefinierte Fehlerseite für WebView bearbeiten oder erstellen?
  • Android.database.CursorWindowAllocationException: Cursor-Fensterzuweisung von 2048 kb ist auch nach dem Schließen des Cursors fehlgeschlagen
  • Wie man lokalhost auf Android-Gerät durchsuchen?
  • Wie kann man ein LinearLayout scrollen
  • Wie rufe ich ein bestimmtes PreferenceFragment von einer PreferenceActivity an?
  • Java.text.ParseException: Unparsable date: "2014-06-04" (bei Offset 5)
  • 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.