Cómo mover un mapa bajo un marcador

Hola a primera pregunta sería extraño, pero déjame explicar .. Supongamos que tenemos un marcador centrado en el mapa, cuando nos movemos el mapa con nuestro dedo podemos ver que el marcador ya no se muestra cuando salió de los límites de la zona . Entonces, ¿cómo podemos hacer un marcador que permanecería siempre en el centro del mapa aunque nos movemos el mapa en cualquier lugar? Hay una aplicación llamada UBER y que proporcionan esta función, no arrastrar y soltar el marcador que acaba de mover el mapa y el marcador se mantuvo su posición ..

Aquí hay un tiro Introduzca aquí la descripción de la imagen

Como se puede ver el marcador verde está en el centro de la pantalla cuando nos movemos el mapa que sigue siendo su lugar, pero muestra la nueva posición cuando el usuario deja de mover el mapa .. ¿Cómo podemos hacer esto?

Tengo un código que muestra la dirección al arrastrar y soltar el marcador, ¿qué tal mostrar la dirección de nuevo, pero esta vez no arrastrando, moviendo el mapa? Espero que pueda entender cualquier idea sería genial ..

public class MainActivity extends AbstractMapActivity implements OnNavigationListener, OnInfoWindowClickListener, OnMarkerDragListener { private static final String STATE_NAV="nav"; private static final int[] MAP_TYPE_NAMES= { R.string.normal, R.string.hybrid, R.string.satellite, R.string.terrain }; private static final int[] MAP_TYPES= { GoogleMap.MAP_TYPE_NORMAL, GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_SATELLITE, GoogleMap.MAP_TYPE_TERRAIN }; private GoogleMap map=null; String filterAddress = ""; Marker marker; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (readyToGo()) { setContentView(R.layout.activity_main); SupportMapFragment mapFrag= (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); mapFrag.setRetainInstance(true); initListNav(); map=mapFrag.getMap(); if (savedInstanceState == null) { CameraUpdate center= CameraUpdateFactory.newLatLng(new LatLng( 41.003739, 28.999572)); CameraUpdate zoom=CameraUpdateFactory.zoomTo(10); map.moveCamera(center); map.animateCamera(zoom); addMarker(map, 41.003739, 28.999572, R.string.un, R.string.united_nations); map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater())); map.setOnInfoWindowClickListener(this); map.setOnMarkerDragListener(this); } } } @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { map.setMapType(MAP_TYPES[itemPosition]); return(true); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putInt(STATE_NAV, getSupportActionBar().getSelectedNavigationIndex()); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_NAV)); } @Override public void onInfoWindowClick(Marker marker) { Toast.makeText(this, marker.getTitle(), Toast.LENGTH_LONG).show(); } @Override public void onMarkerDragStart(Marker marker) { LatLng position=marker.getPosition(); Log.d(getClass().getSimpleName(), String.format("Drag from %f:%f", position.latitude, position.longitude)); } @Override public void onMarkerDrag(Marker marker) { LatLng position=marker.getPosition(); Log.d(getClass().getSimpleName(), String.format("Dragging to %f:%f", position.latitude, position.longitude)); } @Override public void onMarkerDragEnd(Marker marker) { LatLng position=marker.getPosition(); String filterAddress = ""; Geocoder geoCoder = new Geocoder( getBaseContext(), Locale.getDefault()); try { List<Address> addresses = geoCoder.getFromLocation( position.latitude, position.longitude, 1); if (addresses.size() > 0) { for (int index = 0; index < addresses.get(0).getMaxAddressLineIndex(); index++) filterAddress += addresses.get(0).getAddressLine(index) + " "; } }catch (IOException ex) { ex.printStackTrace(); }catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); } Log.d(getClass().getSimpleName(), String.format("Dragging to %f:%f", position.latitude, position.longitude)); TextView myTextView = (TextView) findViewById(R.id.test); myTextView.setText("Address is: " + filterAddress); } private void initListNav() { ArrayList<String> items=new ArrayList<String>(); ArrayAdapter<String> nav=null; ActionBar bar=getSupportActionBar(); for (int type : MAP_TYPE_NAMES) { items.add(getString(type)); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { nav= new ArrayAdapter<String>( bar.getThemedContext(), android.R.layout.simple_spinner_item, items); } else { nav= new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, items); } nav.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); bar.setListNavigationCallbacks(nav, this); } private void addMarker(GoogleMap map, double lat, double lon, int title, int snippet) { map.addMarker(new MarkerOptions().position(new LatLng(lat, lon)) .icon(BitmapDescriptorFactory.fromResource(R.drawable.pin)) .draggable(true)); } } 

Aquí está el xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/img_header" > <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment" /> <TextView android:id="@+id/test" android:layout_width="match_parent" android:layout_height="90dp" android:layout_alignParentRight="true" android:text="Address : " android:textColor="#FF0000" android:textSize="22sp" /> </RelativeLayout> 

Dos sencillos pasos:

Paso 1

Utilicé un RelativeLayout como el padre del fragmento con el mapa y el centro en él un ImageView (que hará como el marcador centrado del mapa apenas como en aplicaciones uber o fáciles del taxi):

 <!-- Map and ImageView in center for simulating the map marker --> <RelativeLayout android:id="@+id/confirm_address_map_wrapper" android:layout_width="match_parent" android:layout_height="220dp"> <fragment android:id="@+id/confirm_address_map_fragment" android:name="com.google.android.gms.maps.MapFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" /> <!-- Image View that acts as map marker notice centerInParent--> <ImageView android:id="@+id/confirm_address_map_custom_marker" android:layout_width="@dimen/ICON_DEFAULT_SIZE" android:layout_height="@dimen/ICON_DEFAULT_SIZE" android:layout_centerInParent="true" android:src="@mipmap/my_map_marker"/> </RelativeLayout> 

Paso 2

OnMapReady () método en mi actividad Yo uso googleMap método de la instancia setOnCameraChangeListener() que me permite escuchar cuando se utiliza el mapa y obtener la latitud y la longitud en función del centro de la posición de la cámara:

  @Override public void onMapReady(GoogleMap googleMap) { googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { Log.i("centerLat",cameraPosition.target.latitude); Log.i("centerLong",cameraPosition.target.longitude); } }); } 

ACTUALIZAR:
OnCameraChangeListener está obsoleto. Utilice OnCameraIdleListener :
[Fuente: https://stackoverflow.com/a/38732283/421467%5D

No pude obtener el efecto de la aplicación Uber, sin embargo, pude hacer algo similar, tal vez lo hará muy bien para su solución haciendo uso de la GoogleMap.OnCameraChangeListener .

Actividad:

 public class MyActivity extends Activity implements OnCameraChangeListener { ... @Override public void onCameraChange(CameraPosition position) { mMap.clear(); mMap.addMarker( new MarkerOptions() .position( position.target ) .title( position.toString() ) ); } ... } 

El problema es que el marcador no se dibuja mientras se mueve la cámara. Sin embargo, parece que ya ha creado una superposición de un marcador. Así que con una superposición debería funcionar como la aplicación Uber.

Espero que esto ayude, incluso la cuestión es de unos meses de edad, tal vez beneficiará a los futuros desarrolladores.

Saludos cordiales Miki

Si está usando Fragment para mostrar su mapa de google, coloque el ImageView dentro del Fragment para superponer su marcador personalizado de modo que su marcador permanezca fijo cuando mueva su mapa. Siga el código para el archivo xml:

 <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.MapFragment" > <ImageView android:id="@+id/pin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:contentDescription="@null" android:src="@drawable/pin" /> </fragment> 

En el archivo activity.java use esto:

 ImageView pinButton = (ImageView) findViewById(R.id.pin); 

setOnCameraChangeListener() para obtener la latitud y la longitud en función del centro de la posición de la cámara o siga la respuesta proporcionada por @androidPlusPlus

Compruebe esta respuesta

Primero: añada una vista de imagen a la misma disposición y la posición igual al centro. Segundo: para obtener la coordenada del centro del mapa utilice el siguiente enfoque

 1_ get viewgroup ( FrameLayout ) in my case where the map fragment is located. - FrameLayout myContainer = (FrameLayout) findViewById(R.id.content_frame); int mapHeight = myContainer.getHeight(); int mapWidth = myContainer.getWidth(); 2_ use setOnCameraChangeListener and on camera change get the coordinates: LatLng center = mMap.getCameraPosition().target; 

Y también aquí está mi solución completa

  • Escribir texto en el marcador personalizado Google Map v2 - Android
  • ¿Cómo saber qué marcador se ha hecho clic en Google Maps v2 para Android?
  • Implementar la animación de caída de pines en google maps android
  • Activación de un evento de mapa (como un clic de marcador) en Google Maps Android V2
  • Eliminar marcador anterior y agregar nuevo marcador en Google Map v2
  • Animación de tipo GIF para marcador en google map api ANDROID
  • Google Maps API v2 con diferentes acciones de marcador
  • Cambio de z-index (z-order) de marcador de mapa para Maps V2 en Android
  • Android Google Maps API v2 - cómo cambiar el icono de marcador
  • Marcadores de mapa con texto en Google Maps Android API v2
  • Android Google map Excepción de puntero nulo al agregar marcador
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.