Cómo centrar el mapa en el marcador haga clic para mostrar todo InfoWindow

Ok, por defecto en el marcador de clic, marcador se centra en el mapa. El problema es, que tengo infoView alto, inflado de la disposición, y demuestra fuera de límites del mapa. ¿Qué puedo hacer, para centrar el pin horizontalmente, y la posición por debajo del centro del mapa, para hacer infoWindow visible.

int zoom = (int)map.getCameraPosition().zoom CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(new LatLng(arg0.getPosition().latitude + (double)90/Math.pow(2, zoom), arg0.getPosition().longitude), zoom); 

Así que terminé con esta solución, funciona como un encanto. Estoy abriendo la ventana de información después de la animación.

GoogleMaps utiliza Web Mercator que distorsiona extremadamente los datos en altas latitudes porque esencialmente mapea nuestro planeta a un cuadrado. Gracias a esto, cuanto más lejos eres de ecuador, el error más grande introduces a algunos cálculos simplificados.

En su lugar vamos a dejar Android tratar con los de nosotros;)

En el siguiente texto mGoogleMap es tu GoogleMap . Vamos a establecer un onMarkerClickListener en el que abrimos el InfoWindow (como en la implementación por defecto de onMarkerClickListener) y luego en lugar de centrar en el propio marcador, recalcular la posición del centro de la cámara de acuerdo con la proyección de GoogleMap .

 mGoogleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { // Calculate required horizontal shift for current screen density final int dX = getResources().getDimensionPixelSize(R.dimen.map_dx); // Calculate required vertical shift for current screen density final int dY = getResources().getDimensionPixelSize(R.dimen.map_dy); final Projection projection = mGoogleMap.getProjection(); final Point markerPoint = projection.toScreenLocation( marker.getPosition() ); // Shift the point we will use to center the map markerPoint.offset(dX, dY); final LatLng newLatLng = projection.fromScreenLocation(markerPoint); // Buttery smooth camera swoop :) mGoogleMap.animateCamera(CameraUpdateFactory.newLatLng(newLatLng)); // Show the info window (as the overloaded method would) marker.showInfoWindow(); return true; // Consume the event since it was dealt with } }); 

animateCamera() mueve la cámara a la posición calculada suavemente, usted puede saltar a la nueva posición con moveCamera() .

También necesitamos agregar las dos dimensiones, map_dx y map_dy , a los recursos:

 <resources> <!-- Where to shift the map center when user taps on marker --> <dimen name="map_dx">10dp</dimen> <dimen name="map_dy">-100dp</dimen> </resources> 

Y hemos terminado, este método (a diferencia de otros) funciona bien en todo el mapa, incluso cerca de los polos de la Tierra.

Intente esto en el adaptador de su infoWindow:

 @Override public View getInfoWindow(Marker marker) { View infoWindowLayout = (View) inflater.inflate(R.layout.my_info_window_layout, null); int width = display.getWidth() (I put here a "*2/3" too to not fill the whole screen, but this is your choice); LinearLayout infoWindowSubLayout = (LinearLayout) infoWindowLayout.findViewById(R.id.myInfoWindowSubLayout); android.widget.LinearLayout.LayoutParams lp = new android.widget.LinearLayout.LayoutParams(width, LayoutParams.MATCH_PARENT); infoWindowSubLayout.setLayoutParams(lp); return infoWindowLayout; } 

Y el archivo de diseño para esto en mi caso es como:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/myInfoWindowLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/..." android:orientation="horizontal" ... > <LinearLayout android:id="@+id/myInfoWindowSubLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" android:orientation="horizontal" ...> <LinearLayout android:layout_width="0px" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center_vertical" android:orientation="vertical" > CONTENT HERE </LinearLayout> CONTENT HERE TOO </LinearLayout> </LinearLayout> 

Bueno, esto funciona para mí, no dude en reescribirlo

He intentado la siguiente solución de trabajo perfecto

 mMap.setOnMarkerClickListener(new OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { int yMatrix = 200, xMatrix =40; DisplayMetrics metrics1 = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics1); switch(metrics1.densityDpi) { case DisplayMetrics.DENSITY_LOW: yMatrix = 80; xMatrix = 20; break; case DisplayMetrics.DENSITY_MEDIUM: yMatrix = 100; xMatrix = 25; break; case DisplayMetrics.DENSITY_HIGH: yMatrix = 150; xMatrix = 30; break; case DisplayMetrics.DENSITY_XHIGH: yMatrix = 200; xMatrix = 40; break; case DisplayMetrics.DENSITY_XXHIGH: yMatrix = 200; xMatrix = 50; break; } Projection projection = mMap.getProjection(); LatLng latLng = marker.getPosition(); Point point = projection.toScreenLocation(latLng); Point point2 = new Point(point.x+xMatrix,point.y-yMatrix); LatLng point3 = projection.fromScreenLocation(point2); CameraUpdate zoom1 = CameraUpdateFactory.newLatLng(point3); mMap.animateCamera(zoom1); marker.showInfoWindow(); return true; } }); 
  • Mostrar ventana de información en cada marcador a la vez
  • Zoom para adaptarse a todos los marcadores en el mapa google maps v2
  • android marker custom infowindow
  • ¿Marcador de mapa de Android?
  • Google Maps v2 Marker zOrdering - Establecer en la parte superior
  • Cómo agregar un Marcador / Pin en un Android de ImageView?
  • AudioTrack - ¿Cómo saber cuándo empieza o termina un sonido?
  • Cómo ocultar los botones "Navegación" y "Puntero GPS" cuando hago clic en el marcador en el mapa google de Android
  • Android MapView no puede eliminar marcador
  • Obtener otros valores de marcador
  • Diferencia entre getInfoWindow () y getInfoContents () en Googlemaps v2 para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.