2012-12-28 12 views
112

La mia domanda è: qualcuno sa come impostare google maps, per aprire sia la mia posizione che in una visualizzazione ingrandita?Google Maps v2 - imposta sia la mia posizione che lo zoom

Attualmente, la vista principale si apre verso l'Africa, completamente ridimensionata.

E così ho cercato per giorni ormai, e tutto quello che posso trovare sono:

1) Non è possibile animare due cose (come lo zoom in e andare alla mia posizione) in una mappa di google? Quindi, se riesco a capire come impostare lo zoom prima di impostare l'animazione, allora questo problema sarebbe risolto. Questa tendenza tende ad essere il problema, puoi cambiarne una, ma non entrambe.

2) Ho trovato altre classi che potrebbero essere utili, ma non c'è aiuto su come impostare il codice in modo che la classe possa manipolare la mappa di google.

Questo è il codice che ho tenuto fino ad ora, alcuni lavori, altri no. Alcuni di quelli che pensavo potrebbero essere utili in seguito.

package com.MYWEBSITE.www; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import android.content.Context; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.Menu; 

public class MainActivity extends FragmentActivity { 
private GoogleMap map; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_layout); 

    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 
    map.setMyLocationEnabled(true); 

    //LocationSource a = (LocationSource) getSystemService(Context.LOCATION_SERVICE); 
    //LocationManager b = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    //map.setLocationSource(a); 

    Criteria criteria = new Criteria(); 
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    String provider = locationManager.getBestProvider(criteria, false); 
    Location location = locationManager.getLastKnownLocation(provider); 
    double lat = location.getLatitude(); 
    double lng = location.getLongitude(); 
    LatLng coordinate = new LatLng(lat, lng); 

    //CameraPosition.Builder x = CameraPosition.builder(); 
    //x.target(coordinate); 
    //x.zoom(13); 

    //Projection proj = map.getProjection(); 
    //Point focus = proj.toScreenLocation(coordinate); 

    //map.animateCamera(CameraUpdateFactory.newLatLng(coordinate)); 
    map.animateCamera(CameraUpdateFactory.zoomBy(13)); 
    //map.moveCamera(CameraUpdateFactory.newLatLng(coordinate)); 


    ////LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds; 
} 
} 

risposta

186

Non è possibile animare due cose (come lo zoom in e andare alla mia posizione) in un google map?

Dal punto di vista di codifica, si dovrebbe fare in sequenza:

CameraUpdate center= 
     CameraUpdateFactory.newLatLng(new LatLng(40.76793169992044, 
               -73.98180484771729)); 
    CameraUpdate zoom=CameraUpdateFactory.zoomTo(15); 

    map.moveCamera(center); 
    map.animateCamera(zoom); 

Qui, sposto la macchina fotografica, poi animare la fotocamera, anche se entrambi potrebbero essere animateCamera() chiamate. Se lo standard GoogleMap li consolida in un singolo evento, non posso dire, perché è troppo veloce. :-)

Here is the sample project da cui ho estratto il codice precedente.


Siamo spiacenti, questa risposta è difettosa. Vedi la risposta di Rob per un modo per farlo veramente in un colpo solo, creando un CameraPosition e creando quindi unda quello CameraPosition.

+0

non deve essere la risposta accettata. La risposta di Mubeen1992 è corretta. – Matthew

+1

@AlanHaverty: l'app di esempio a cui mi collego nella risposta contiene quel codice. Funziona perfettamente bene. L'ho appena testato su un Nexus 9 con Android 7.0 e un Nexus 6P con Android 6.0.1. Ha funzionato perfettamente bene per un paio di anni. Non * li fa in un colpo solo, e sono d'accordo che Rob è una risposta superiore, come ho notato nella mia risposta. Se ritieni di avere prove che questo codice non funziona, pubblica un progetto di esempio da qualche parte. – CommonsWare

+0

@CommonsWare Le mie scuse, mentre testavo con il tuo codice, l'angolo in alto a sinistra della mia mappa sembrava essere impostato con lat lng. Immaginavo che avessi scambiato il significato di .newLatLng(). Non sono sicuro del motivo per cui è stato spento, dev'essere stato qualcos'altro sulla mia fine, i doc dell'API dimostrano il tuo caso, mi dispiace per aver fatto innescare la tua risposta felice! Eliminare il mio primo commento per evitare confusione .. API Origine: https://developers.google.com/android/reference/com/google/android/gms/maps/CameraUpdateFactory.html#newLatLng(com.google.android .gms.maps.model.LatLng) –

7

È inoltre possibile impostare entrambi i parametri come,

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(21.000000, -101.400000) ,4)); 

Questa individua la tua mappa su una posizione e lo zoom specifico. Lo uso nell'impostazione della mia mappa.

150

È possibile cambiare posizione, zoom, rilevamento e inclinazione in una volta. È anche possibile impostare la durata della chiamata animatecamera.

CameraPosition cameraPosition = new CameraPosition.Builder() 
    .target(MOUNTAIN_VIEW)  // Sets the center of the map to Mountain View 
    .zoom(17)     // Sets the zoom 
    .bearing(90)    // Sets the orientation of the camera to east 
    .tilt(30)     // Sets the tilt of the camera to 30 degrees 
    .build();     // Creates a CameraPosition from the builder 
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

Dai un'occhiata alla la documentazione qui:

https://developers.google.com/maps/documentation/android/views?hl=fr-FR#moving_the_camera

+0

Questo va perfetto – Noman

12

Prova in questo modo -

public class SummaryMapActivity extends FragmentActivity implements LocationListener{ 

private GoogleMap mMap; 
private LocationManager locationManager; 
private static final long MIN_TIME = 400; 
private static final float MIN_DISTANCE = 1000; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.summary_mapview); 

    if (mMap == null) { 
     // Try to obtain the map from the SupportMapFragment. 
     mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
       .getMap(); 
     // Check if we were successful in obtaining the map. 
     if (mMap != null) { 
      mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); 
     } 
    } 
    mMap.setMyLocationEnabled(true); 

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, MIN_DISTANCE, this); 


} 

@Override 
public void onLocationChanged(Location location) { 
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15); 
    mMap.animateCamera(cameraUpdate); 
    locationManager.removeUpdates(this); 

} 

@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 

}

+0

Grazie mille mi aiuta :) –

49

questo è soluzione semplice per la tua domanda

LatLng coordinate = new LatLng(lat, lng); 
CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 5); 
map.animateCamera(yourLocation); 
-2
gmap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(9.491327, 76.571404), 10, 30, 0))); 
3

È una risposta tardiva, ma penso che sarà di aiuto. Utilizzare questo metodo:

protected void zoomMapInitial(LatLng finalPlace, LatLng currenLoc) { 
    try { 
     int padding = 200; // Space (in px) between bounding box edges and view edges (applied to all four sides of the bounding box) 
     LatLngBounds.Builder bc = new LatLngBounds.Builder(); 

     bc.include(finalPlace); 
     bc.include(currenLoc); 
     googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bc.build(), padding)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Utilizzare questo metodo dopo aver caricato la mappa. Saluti!

+0

I loro documenti un po 'obsoleti, questo ha finalmente funzionato! – Starwave

1

Il modo più semplice per farlo è utilizzare CancelableCallback. È necessario verificare la prima azione è completa e quindi chiamare il secondo:

mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, size.x, height, 0), new CancelableCallback() { 

       @Override 
       public void onFinish() { 
        CameraUpdate cu_scroll = CameraUpdateFactory.scrollBy(0, 500); 
        mMap.animateCamera(cu_scroll); 
       } 

       @Override 
       public void onCancel() { 
       } 
      }); 
+0

Grazie mille. Penso che questa dovrebbe essere la risposta accettata. Le tue soluzioni funzionano alla grande – Chandru

0

@ La risposta di CommonsWare in realtà non funziona. Ho trovato che funziona correttamente:

map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-33.88,151.21), 15)); 
1

1.Aggiungi codice xml nel layout per la visualizzazione delle mappe.

2.Enable google maps api quindi ottenere api la chiave posto che di seguito.

<fragment 
        android:id="@+id/map" 
       android:name="com.google.android.gms.maps.MapFragment" 
        android:layout_width="match_parent" 
        android:value="ADD-API-KEY" 
        android:layout_height="250dp" 
        tools:layout="@layout/newmaplayout" /> 
     <ImageView 
      android:id="@+id/transparent_image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:src="@color/transparent" /> 

3.Aggiungere questo codice in oncreate.

MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
    mapFragment.getMapAsync(UpadateProfile.this); 

4. Aggiungere questo codice dopo oncreate. quindi accedere al percorso di corrente con indicatore posto in quel

@Override 
public void onMapReady(GoogleMap rmap) { 
    DO WHATEVER YOU WANT WITH GOOGLEMAP 
    map = rmap; 
    setUpMap(); 
} 
public void setUpMap() { 
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
    map.setMyLocationEnabled(true); 
    map.setTrafficEnabled(true); 
    map.setIndoorEnabled(true); 
    map.getCameraPosition(); 
    map.setBuildingsEnabled(true); 
    map.getUiSettings().setZoomControlsEnabled(true); 
    markerOptions = new MarkerOptions(); 
    markerOptions.title("Outlet Location"); 
    map.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 
     @Override 
     public void onMapClick(LatLng point) { 
      map.clear(); 
      markerOptions.position(point); 
      map.animateCamera(CameraUpdateFactory.newLatLng(point)); 
      map.addMarker(markerOptions); 
      String all_vals = String.valueOf(point); 
      String[] separated = all_vals.split(":"); 
      String latlng[] = separated[1].split(","); 
      MyLat = Double.parseDouble(latlng[0].trim().substring(1)); 
      MyLong = Double.parseDouble(latlng[1].substring(0,latlng[1].length()-1)); 
      markerOptions.title("Outlet Location"); 
      getLocation(MyLat,MyLong); 
     } 
    }); 
} 
public void getLocation(double lat, double lng) { 
    Geocoder geocoder = new Geocoder(UpadateProfile.this, Locale.getDefault()); 
    try { 
     List<Address> addresses = geocoder.getFromLocation(lat, lng, 1); 
    } catch (IOException e) { 
     TODO Auto-generated catch block 
     e.printStackTrace(); 
     Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show(); 
    } 
} 
@Override 
public void onLocationChanged(Location location) { 
} 
@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
} 
@Override 
public void onProviderEnabled(String provider) { 
} 
@Override 
public void onProviderDisabled(String provider) { 
} 
0

Non è possibile animare due cose (come lo zoom in e andare alla mia posizione) in una mappa di google.
Così utilizzare mossa e animare Camera per ingrandire

googleMapVar.moveCamera(CameraUpdateFactory.newLatLng(LocLtdLgdVar)); 
googleMapVar.animateCamera(CameraUpdateFactory.zoomTo(10)); 
Problemi correlati