¿Cómo centrar la cámara para que el marcador esté en la parte inferior de la pantalla? (Google map api V2 Android)

Cuando se hace clic en un marcador, el comportamiento predeterminado de la cámara es centrarlo en la pantalla, pero como normalmente tengo una descripción de texto larga en la ventana de información, es más conveniente cambiar realmente la posición de la cámara para que el marcador esté en la parte inferior de (Haciendo la ventana de información en el centro de la pantalla). Creo que debería ser capaz de hacer eso mediante la sustitución onMarkerClick función como a continuación (el comportamiento predeterminado se cancela cuando esta función devuelve true)

@Override public boolean onMarkerClick(final Marker marker) { // Google sample code comment : We 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). marker.showInfoWindow(); CameraUpdate center= CameraUpdateFactory.newLatLng(new LatLng(XXXX, XXXX)); mMap.moveCamera(center);//my question is how to get this center // return false; return true; } 

Editar:

Problema resuelto usando los pasos de la respuesta aceptada, códigos abajo:

 @Override public boolean onMarkerClick(final Marker marker) { //get the map container height LinearLayout mapContainer = (LinearLayout) findViewById(R.id.map_container); container_height = mapContainer.getHeight(); Projection projection = mMap.getProjection(); LatLng markerLatLng = new LatLng(marker.getPosition().latitude, marker.getPosition().longitude); Point markerScreenPosition = projection.toScreenLocation(markerLatLng); Point pointHalfScreenAbove = new Point(markerScreenPosition.x, markerScreenPosition.y - (container_height / 2)); LatLng aboveMarkerLatLng = projection .fromScreenLocation(pointHalfScreenAbove); marker.showInfoWindow(); CameraUpdate center = CameraUpdateFactory.newLatLng(aboveMarkerLatLng); mMap.moveCamera(center); return true; } 

Gracias por ayudar ^ ^

9 Solutions collect form web for “¿Cómo centrar la cámara para que el marcador esté en la parte inferior de la pantalla? (Google map api V2 Android)”

Puedo editar esta respuesta más adelante para proporcionar algún código, pero lo que creo que podría funcionar es esto:

  1. Obtener LatLng ( LatLng M ) del marcador pulsado.
  2. Convertir LatLng M a un Point ( punto M ) mediante el método Projection.toScreenLocation(LatLng) . Esto le da la ubicación del marcador en la pantalla del dispositivo (en píxeles).
  3. Calcule la ubicación de un punto ( Nuevo Punto ) que está por encima del Punto M por la mitad de la altura del mapa.
  4. Convierta el Nuevo Punto en LatLng y centre el mapa en él.

Mira aquí mi respuesta sobre cómo obtener la altura del mapa.

  // googleMap is a GoogleMap object // view is a View object containing the inflated map // marker is a Marker object Projection projection = googleMap.getProjection(); LatLng markerPosition = marker.getPosition(); Point markerPoint = projection.toScreenLocation(markerPosition); Point targetPoint = new Point(markerPoint.x, markerPoint.y - view.getHeight() / 2); LatLng targetPosition = projection.fromScreenLocation(targetPoint); googleMap.animateCamera(CameraUpdateFactory.newLatLng(targetPosition), 1000, null); 

Sí, utilice la clase de proyección. Más específicamente:

Obtener la proyección del mapa:

  Projection projection = map.getProjection(); 

Obtenga la ubicación de su marcador:

  LatLng markerLocation = marker.getPosition(); 

Pase la ubicación al método Projection.toScreenLocation ():

  Point screenPosition = projection.toScreenLocation(markerLocation); 

De esta manera puede mover su marcador en relación con el centro o alrededor de la pantalla

 Point mappoint = googleMap.getProjection().toScreenLocation(new LatLng(latitude, longitude)); mappoint.set(mappoint.x, mappoint.y-30); googleMap.animateCamera(CameraUpdateFactory.newLatLng(googleMap.getProjection().fromScreenLocation(mappoint))); 

Yo prefiero la respuesta de Larry McKenzie que no depende de la proyección de pantalla (es decir, mProjection.toScreenLocation ()), mi conjetura es que la resolución de la proyección será mala cuando el nivel de zoom del mapa es baja, me hizo a veces no podía obtener una precisión posición. Por lo tanto, el cálculo basado en la especificación de mapa de google definitivamente resolver el problema.

A continuación se muestra un ejemplo de código para mover el marcador al 30% del tamaño de la pantalla desde abajo.

 zoom_lvl = mMap.getCameraPosition().zoom; double dpPerdegree = 256.0*Math.pow(2, zoom_lvl)/170.0; double screen_height = (double) mapContainer.getHeight(); double screen_height_30p = 30.0*screen_height/100.0; double degree_30p = screen_height_30p/dpPerdegree; LatLng centerlatlng = new LatLng( latlng.latitude + degree_30p, latlng.longitude ); mMap.animateCamera( CameraUpdateFactory.newLatLngZoom( centerlatlng, 15 ), 1000, null); 

Tuve el mismo problema, he intentado la siguiente solución perfectamente de trabajo

 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; } }); 

Si usted no cuida sobre el mapa que amplía adentro y apenas quiere que el marcador esté en la parte inferior vea abajo, pienso que es una solución más simple

 double center = mMap.getCameraPosition().target.latitude; double southMap = mMap.getProjection().getVisibleRegion().latLngBounds.southwest.latitude; double diff = (center - southMap); double newLat = marker.getPosition().latitude + diff; CameraUpdate centerCam = CameraUpdateFactory.newLatLng(new LatLng(newLat, marker.getPosition().longitude)); mMap.animateCamera(centerCam); 

Hice un poco de investigación y de acuerdo a la documentación el mapa es cuadrado y en el nivel de zoom cero el ancho y la altura es 256dp y +/- 85 grados N / S. El ancho del mapa aumenta con el nivel de zoom de modo que el ancho y la altura = 256 * 2N dp. Donde N es el nivel de zoom. Así que en teoría se puede determinar la nueva ubicación al obtener la altura del mapa y dividirla por 170 grados totales para obtener dp por grado. A continuación, obtener la altura de la pantalla (o la altura del mapa) en dp dividido por dos y convertir medio tamaño de vista a grados de latitud. A continuación, establezca su nuevo punto de cámara que muchos grados de latitud sur. Puedo añadir código si lo necesitas pero estoy en un teléfono en este momento.

He estado probando todas las soluciones propuestas aquí, y vino con una aplicación combinada de ellas. Considerando, la proyección de mapa, la inclinación, el zoom y la altura de la ventana de información.

Realmente no coloca el marcador en la parte inferior de la "vista de la cámara", pero creo que acomoda la ventana de información y el centro marcador muy bien en la mayoría de los casos.

 @Override public boolean onMarkerClick(Marker marker) { mIsMarkerClick = true; mHandler.removeCallbacks(mUpdateTimeTask); mLoadTask.cancel(true); getActivity().setProgressBarIndeterminateVisibility(false); marker.showInfoWindow(); Projection projection = getMap().getProjection(); Point marketCenter = projection.toScreenLocation(marker.getPosition()); float tiltFactor = (90 - getMap().getCameraPosition().tilt) / 90; marketCenter.y -= mInfoWindowAdapter.getInfoWindowHeight() / 2 * tiltFactor; LatLng fixLatLng = projection.fromScreenLocation(marketCenter); mMap.animateCamera(CameraUpdateFactory.newLatLng(fixLatLng), null); return true; } 

Y luego, su adaptador personalizado tendría que mantener una instancia de la ventana de información vista inflada, para poder obtener su altura.

 public int getInfoWindowHeight(){ if (mLastInfoWindoView != null){ return mLastInfoWindoView.getMeasuredHeight(); } return 0; } 

Cualquier persona que todavía está mirando para centrar la cámara según coordenadas de la localización

 CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(Lat, Lon)) .zoom(15) .bearing(0) .tilt(45) .build(); map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

Créditos

Después de algunas experiencias he implementado la solución que bien para mí.

 DisplayMetrics metrics = new DisplayMetrics(); context.getWindowManager().getDefaultDisplay().getMetrics(metrics); Point targetPoint = new Point(metrics.widthPixels / 2, metrics.heightPixels - metrics.heightPixels / 9); LatLng targetLatlng = map.getProjection().fromScreenLocation(targetPoint); double fromCenterToTarget = SphericalUtil.computeDistanceBetween(map.getCameraPosition().target, targetLatlng); LatLng center = SphericalUtil.computeOffset(new LatLng(location.latitude, location.longitude), fromCenterToTarget/1.2, location.bearing); CameraUpdate camera = CameraUpdateFactory.newLatLng(center); map.animateCamera(camera, 1000, null); 

Aquí. Primero, seleccionamos el punto físico en la pantalla donde se debe mover el marcador. Luego, convertirlo a LatLng. Paso siguiente – Calcule la distancia desde la posición actual del marcador (en el centro) hasta el objetivo. Finalmente, movemos el centro del mapa directamente del marcador a la distancia calculada.

  • Los eventos de zoom que funcionan en un androide Mapview
  • Uso de una imagen como GoogleMap
  • Java.io.IOException: falló grpc
  • Android Google Maps v2 problema de rendimiento polígono?
  • Error al inicializar GoogleService
  • Cómo obtener la ubicación GPS de Android
  • Giro a giro múltiples puntos ruta navegación Google Maps Intent en Android
  • Android - IllegalStateException: mapa tiene tamaño cero
  • No haga clic en el marcador después de hacer clic en android map v2
  • Cómo manejar el evento onTouch para el mapa en Google Map API v2?
  • Obtención de la clave de la API de Google Maps
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.