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
- Mover marcador en google maps api 2
- Maps de Android ClusteredMarkers - no muestran unclustered?
- Cómo mover el marcador a lo largo de la polilínea mediante google map
- Agregar marcador en la ubicación tocada usando google map en android
- Cómo mostrar el marcador de posición actual en el mapa en android?
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>
- Map.setmylocationenabled (true) no funciona
- Superposiciones de mapas eficaces en Google Maps de Google
- Cómo buscar en Google Map Api V2 Android?
- Cómo mostrar el texto en un marcador personalizado dibujable
- Referencia de mapa de bits desconocida publicada
- ¿Cómo obtener la posición del marcador antes de arrastrar?
- Gráficos vectoriales utilizados para google map marker
- Agregando marcador múltiple en google map en android
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
- Obtener el valor de la barra de búsqueda de android y mostrarlo en la pantalla
- Cómo agarrar JSON Array y utilizar gson para analizar cada objeto json? (Retrofit)