2013-02-12 12 views
18

Vorrei sostituire l'icona predefinita che Android Maps V2 utilizza per "La mia posizione" (Il puntino blu/freccia) con la mia immagine. Ho creato la mia tessera provider che include alcune mappe che sono prevalentemente blu e pertanto l'icona La mia posizione predefinita è molto difficile da vedere. In precedenza avrei appena scavalcato il metodo di disegno dello MyLocationOverlay, ma non sembra essercene uno nella nuova API. Qualsiasi aiuto sarebbe grande!Android Maps API v2 Modifica icona MyLocation

MODIFICA: Ho anche bisogno che l'icona sia in grado di ruotare, allo stesso modo della freccia a seconda di quale direzione stai affrontando. Quindi non posso semplicemente utilizzare un normale :(Fondamentalmente ho solo bisogno di creare un'immagine personalizzata per quella freccia ..

enter image description here

Aggiornamento Ciao a tutti, l'aggiornamento subito Google Play consente marcatori piatte e la rotazione marcatore che è esattamente quello che mi serviva

+0

Avere è stata selezionata la demo di Google Map v2 nel vostro SDK che hanno 'dimostrare la funzionalità di aggiunta del marcatore l'immagine personalizzata con e ruotare di conseguenza anche. – GrIsHu

+0

Hey Grishu, ho dato un'occhiata agli esempi nell'SDK, quale parte dell'applicazione dimostrativa guarda specificamente ruotando l'icona della mia posizione? Non riesco a trovarlo. – Gyroscope

+0

Nella demo sdk, controlla la classe di marker che ha mostrato il modo di aggiungere il marker sulla mappa. – GrIsHu

risposta

19

L'ultimo aggiornamento di Google Play Services consente ora di utilizzare i marcatori 'flat' e ruotare loro che è esattamente quello che mi serviva. Ecco una versione semplice del modo in cui l'ho implementata. C'è probabilmente un bel po 'che posso fare per ottimizzare e modificare l'animazione, ma fa il lavoro per il momento. Qualsiasi commento è benvenuto.

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

Non funziona così bene:/ – Nima

+0

Questo account è a supporto? –

+0

Perché questa riga mi dà errore di tipo Incompatibile? interpolatore finale interpolatore = nuovo LinearInterpolator(); –

-2

puoi cambiare la tua icona della posizione corrente facendo:.

mMap.addMarker(new MarkerOptions().position(new LatLng(location.getLatitude(), location.getLongitude())) 
        .title("Current Location") 
        .snippet(address) 
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_image))); 
+0

@Giroscopio hey ha funzionato o no? – KunalK

+0

puoi fare il titolo sull'immagine .title ("Posizione attuale") = impostare l'indirizzo dell'immagine del titolo impostato nell'immagine puoi farlo ....... o se sai che ... – Amitsharma

24

il mio modo semplice soluzione è a disattivare "il mio locatio n" di Google map

e creare ImageView sulla mappa con la mia icona quindi acquisire ImageView con

onClick e getMyLocation, animateCamera in 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())); 

      }  
} 
0

Non si può gestire cliccare caso di tasto MyLocation sulla mappa di Google, sì, ma c'è un trucco attraverso il quale è possibile ottenere il comportamento secondo il vostro bisogno:
prima nel file layout.xml aggiungere mappa e fittizio Pulsante MyLocation.
È possibile raggiungere questo obiettivo con l'aiuto di layout relativa:

<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> 


si può prendere "mylocation.png" sembra u vedere sulla mappa di Google.
LocationManager locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);

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

    Location location = locationManager.getLastKnownLocation(s); 

chiamata evento click del pulsante MyLocation manichino, in cui potrete aggiungere marcatore
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));
In questo modo è possibile modificare di Google map icona predefinita.
Sì anche è necessario impostare il livello di zoom:
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

4

A partire dal 3.1.36 non è possibile modificare l'icona (lo sento cambierà in futuro, ma guardando la rapidità di attuazione miglioramenti API v2, è non sarà prima di Natale).

È tuttavia possibile utilizzare un indicatore ora, perché ha la funzione setIcon.

Fondamentalmente è necessario dimenticare GoogleMap.setMyLocationEnabled, perché verrà sempre visualizzato sopra.Creerai invece il tuo LocationClient e utilizzerai lat, long e bearing da Location per aggiornare Marker. Aggiungere inoltre un valore Circle e utilizzare la precisione per avere un effetto simile alla visualizzazione di mia posizione predefinita.

0

provare questo; Io lo uso per disegnare un percorso sulla mappa, ma ho impostato le icone per i marcatori e per la mia posizione Dichiarare questo per visualizzare la vostra posizione:

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

E creare una funzione del genere, che ho usato per disegnare sulla mappa, ma ho impostato icone sui marcatori e la mia posizione:

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(); 
    } 
} 
+0

puoi fare il titolo su image .title ("Estadio Cuscatlan") = set nell'indirizzo dell'immagine del titolo impostato nell'immagine può farlo ........ – Amitsharma

0

Ecco il codice per accedere pulsante posizione:

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); 
+0

Benvenuto in Stack Overflow! Grazie per questo snippet di codice, che potrebbe fornire un aiuto immediato. Una spiegazione appropriata [migliorerebbe notevolmente] (// meta.stackexchange.com/q/114762) il suo valore educativo mostrando * perché * questa è una buona soluzione al problema e renderebbe più utile ai futuri lettori con simili, ma non identiche, domande. Si prega di [modificare] la risposta per aggiungere una spiegazione e fornire un'indicazione di quali limitazioni e ipotesi si applicano. –

Problemi correlati