Reemplazar la API de mapas de Android predeterminada v2 Cambiar el ícono de MyLocation

7 minutos de lectura

avatar de usuario
Giroscopio

Me gustaría reemplazar el ícono predeterminado que usa Android Maps V2 para ‘Mi ubicación’ con mi propia imagen. Creé mi propio proveedor de mosaicos que trae algunos mapas que son predominantemente azules y, como tal, el ícono predeterminado de Mi ubicación, la pequeña flecha azul, es muy difícil de ver.

1648492271 837 Reemplazar la API de mapas de Android predeterminada v2 Cambiar

Previamente habría anulado el método de dibujo del MyLocationOverlaypero no parece haber uno en la nueva API.

También necesito que el ícono pueda rotar, de la misma manera que lo hace la flecha dependiendo de en qué dirección estés mirando. Así que no puedo usar un marcador normal. Básicamente, solo necesito crear una imagen personalizada para esa flecha.

  • ¿Ha revisado la demostración de Google Map v2 en su SDK que ha demostrado la funcionalidad de agregar el marcador con su imagen personalizada y rotarlo también en consecuencia?

    – GrIsHu

    16 de febrero de 2013 a las 4:45

  • Hola Grishu, Eché un vistazo a los ejemplos en el SDK. ¿Qué parte de la aplicación de demostración mira específicamente la rotación del icono de mi ubicación? Parece que no pude encontrarlo.

    – giroscopio

    23 de febrero de 2013 a las 3:13

  • En la demostración de SDK, verifique la clase de marcador que ha mostrado la forma de agregar el marcador en el mapa.

    – GrIsHu

    23 de febrero de 2013 a las 4:40

mi forma de solución simple es simplemente deshabilitar “mi ubicación” del mapa de Google

y cree ImageView en el mapa con mi icono y luego capture ImageView con

onClick y getMyLocation , animateCamera en onClick

 this.mGoogleMap.getUiSettings().setMyLocationButtonEnabled(false);
 this.mGoogleMap.setMyLocationEnabled(true);

.

@Override
public void onClick(final View v) {

    Location location = this.mGoogleMap.getMyLocation();

        if (location != null) {

            LatLng target = new LatLng(location.getLatitude(), location.getLongitude());
            CameraPosition position = this.mGoogleMap.getCameraPosition();

            Builder builder = new CameraPosition.Builder();
            builder.zoom(15);
            builder.target(target);

            this.mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(builder.build()));

          }    
}

avatar de usuario
Giroscopio

La última actualización de Google Play Services ahora le permite usar marcadores ‘planos’ y rotarlos, que es exactamente lo que necesitaba. Aquí hay una versión simple de la forma en que lo implementé. Probablemente haya algo que pueda hacer para optimizar y ajustar la animación, pero por el momento hace el trabajo. Cualquier comentario es bienvenido.

Marker mPositionMarker;
GoogleMap mMap;

@Override
public void onLocationChanged(Location location) {

    if (location == null)
        return;

    if (mPositionMarker == null) {

        mPositionMarker = mMap.addMarker(new MarkerOptions()
                .flat(true)
                .icon(BitmapDescriptorFactory
                        .fromResource(R.drawable.positionIndicator))
                .anchor(0.5f, 0.5f)
                .position(
                        new LatLng(location.getLatitude(), location
                                .getLongitude())));
    }

    animateMarker(mPositionMarker, location); // Helper method for smooth
                                                // animation

    mMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(location
            .getLatitude(), location.getLongitude())));

}

public void animateMarker(final Marker marker, final Location location) {
    final Handler handler = new Handler();
    final long start = SystemClock.uptimeMillis();
    final LatLng startLatLng = marker.getPosition();
    final double startRotation = marker.getRotation();
    final long duration = 500;

    final Interpolator interpolator = new LinearInterpolator();

    handler.post(new Runnable() {
        @Override
        public void run() {
            long elapsed = SystemClock.uptimeMillis() - start;
            float t = interpolator.getInterpolation((float) elapsed
                    / duration);

            double lng = t * location.getLongitude() + (1 - t)
                    * startLatLng.longitude;
            double lat = t * location.getLatitude() + (1 - t)
                    * startLatLng.latitude;

            float rotation = (float) (t * location.getBearing() + (1 - t)
                    * startRotation);

            marker.setPosition(new LatLng(lat, lng));
            marker.setRotation(rotation);

            if (t < 1.0) {
                // Post again 16ms later.
                handler.postDelayed(this, 16);
            }
        }
    });
}

  • ¿Esto explica el rodamiento?

    – James Andrés

    29 de agosto de 2014 a las 16:58

  • ¿Por qué esta línea me da un error de tipo incompatible? Interpolador final interpolador = new LinearInterpolator();

    – Keval Patel

    25 de agosto de 2015 a las 16:36

  • Puedo confirmar que este método animado ya no funciona bien. Sin embargo, si desea suavizar el movimiento de la pantalla, simplemente use map.animateCamera() en lugar de map.moveCamera. Ahora mismo es suficiente para mí

    – Zach

    8 de enero de 2017 a las 23:18

A partir de la versión 3.1.36 no puede cambiar el icono (creo que cambiará en el futuro, pero mirando la velocidad de implementación de las mejoras de API v2, no será antes de Navidad).

Sin embargo, puede usar un marcador ahora, porque tiene setIcon función.

Básicamente tienes que olvidarte de GoogleMap.setMyLocationEnabled, porque siempre aparecerá arriba. En su lugar, creará su propio LocationClient y use lat, long y rumbo desde Location para actualizar el Marker. Adicional añada un Circle y use la precisión para tener un efecto similar a la visualización predeterminada de myLocation.

  • saludos desde 2019, nunca se agregó al SDK, pero mirando la velocidad de desarrollo, no estará listo antes de que mis hijos por nacer obtengan una licenciatura

    – Jan Rabe

    24 de julio de 2019 a las 11:50

No puede manejar el evento de clic del botón MyLocation en el mapa de Google, sí, pero hay un truco a través del cual puede obtener el comportamiento según sus necesidades:
primero en su archivo layout.xml, agregue el mapa y el botón ficticio MyLocation.
Puede lograr esto con la ayuda de Relative Layout:

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/myLocationButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:background="@drawable/mylocation" />
</RelativeLayout>

Puede tomar “miubicación.png” como se ve en el mapa de Google.
LocationManager locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);

    Criteria criteria = new Criteria();
    String s = locationManager.getBestProvider(criteria, false);

    Location location = locationManager.getLastKnownLocation(s);  

Evento de clic de llamada de su botón ficticio MyLocation, en el que agregará un marcador
private GoogleMap googleMap;
googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
googleMap.addMarker(new MarkerOptions().icon(YOUR_MODIFIED_ICON).position(latLng).title(TITLE).snippet(SNIPET));

De esta forma puede modificar el icono predeterminado del mapa de Google.
Sí, también necesitas establecer el nivel de zoom:
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

Aquí está el código para acceder al botón de ubicación:

View mv=findViewById(R.id.map);
        View locationButton = ((View) mv.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
        RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
// position on right bottom
        rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
        rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
        rlp.setMargins(0, 180, 180, 0);

  • ¡Bienvenido a Stack Overflow! Gracias por este fragmento de código, que puede proporcionar ayuda inmediata. Una explicación adecuada mejoraría mucho su valor educativo al mostrar por qué esta es una buena solución al problema y lo haría más útil para futuros lectores con preguntas similares, pero no idénticas. Edite su respuesta para agregar una explicación y dar una indicación de las limitaciones y suposiciones que se aplican.

    –Toby Speight

    5 de junio de 2017 a las 11:29

avatar de usuario
djose90

prueba esto; Lo uso para dibujar una ruta en el mapa, pero configuro íconos para los marcadores y para mi ubicación Declare esto para ver su ubicación:

    LocationManager locationManager = (LocationManager) 
    getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    String provider = locationManager.getBestProvider(criteria, true);
    Location myLocation= locationManager.getLastKnownLocation(provider);

    longitude = myLocation.getLongitude();
    latitude  = myLocation.getLatitude();
    fromPosition = new LatLng(latitude, longitude);

Y cree una función como esa, la usé para dibujar en el mapa pero configuré íconos en los marcadores y mi posición:

mGoogleMap.clear();
if(response.equalsIgnoreCase("Success"))
{
     ArrayList<LatLng> directionPoint = v2GetRouteDirection.getDirection(document);
     PolylineOptions rectLine = new PolylineOptions().width(7).color(Color.BLUE);

     for (int i = 0; i < directionPoint.size(); i++) {
     rectLine.add(directionPoint.get(i));
     }
     // Adding route on the map
     mGoogleMap.setOnMarkerClickListener(MainActivity.this);
     mGoogleMap.addPolyline(rectLine);
     markerOptions.position(fromPosition);
     markerOptions.draggable(true);
     Marker1 = mGoogleMap.addMarker(new MarkerOptions()
               .position(Estadio)
               .title("Estadio Cuscatlan")
               .snippet("Estadio Cuscatlan")                                                    
               .icon(BitmapDescriptorFactory                                          
               .fromResource(R.drawable.mapmarker))); 
     Marker2 = mGoogleMap.addMarker(new MarkerOptions()
               .position(Metrocentro)
           .title("Metrocentro")
           .snippet("Metrosuelo")
           .icon(BitmapDescriptorFactory
           .fromResource(R.drawable.mapmark
      Marker3 = mGoogleMap.addMarker(new MarkerOptions()
            .position(Mejicanos)
            .title("Mejicanos")
            .snippet("Mejicanos")
            .icon(BitmapDescriptorFactory
            .fromResource(R.drawable.mapmarker)));  
      MarkerMe = mGoogleMap.addMarker(new MarkerOptions()                                             
                        .position(fromPosition) 
                        .icon(BitmapDescriptorFactory
                        .fromResource(R.drawable.car64)));
   }
    Dialog.dismiss();
    } 
} 

  • ¡Bienvenido a Stack Overflow! Gracias por este fragmento de código, que puede proporcionar ayuda inmediata. Una explicación adecuada mejoraría mucho su valor educativo al mostrar por qué esta es una buena solución al problema y lo haría más útil para futuros lectores con preguntas similares, pero no idénticas. Edite su respuesta para agregar una explicación y dar una indicación de las limitaciones y suposiciones que se aplican.

    –Toby Speight

    5 de junio de 2017 a las 11:29

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad