L'opzione migliore è utilizzare uno GroundOverlay
per mostrare lo sfondo, aggiungerlo e rimuoverlo quando la vista cambia e calcolare le sue dimensioni in base allo VisibleRegion
della mappa in modo che mantenga la dimensione corretta tra gli zoom.
Da the documentation:
Posizione
Ci sono due modi per specificare la posizione della sovrapposizione terra:
Usando una posizione: è necessario fornire un'immagine di la sovrapposizione a terra, un LatLng a cui verrà fissata l'ancora e la larghezza della sovrapposizione (in metri). L'ancoraggio è, per impostazione predefinita, 50% dalla parte superiore dell'immagine e 50% dalla parte sinistra dell'immagine. Questo può essere cambiato. Opzionalmente è possibile fornire l'altezza della sovrapposizione (in metri). Se non si fornisce l'altezza della sovrapposizione, verrà automaticamente calcolata per preservare le proporzioni dell'immagine.
Utilizzo di un limite: è necessario fornire un LatLngBounds che conterrà l'immagine.
Il seguente esempio utilizza un OnCameraChangeListener
rimuovere e aggiungere un GroundOverlay
che mostra il ic_launcher
drawable nel centro della mappa, 75% della larghezza della carta (Rimozione e aggiunta la GroundOverlay
sul onCameraChange
evento assicura che la dimensione dell'immagine sia sempre la stessa indipendentemente dal livello di zoom).
public class MyMapActivity extends Activity implements OnCameraChangeListener {
GroundOverlay backgroundOverlay = null;
GoogleMap map;
// ...
@Override
public void onCameraChange(final CameraPosition cameraPosition) {
if (backgroundOverlay != null) {
backgroundOverlay.remove();
}
VisibleRegion visibleRegion = map.getProjection()
.getVisibleRegion();
Location nearLeftLocation = new Location("nearLeftLocation");
nearLeftLocation.setLatitude(visibleRegion.nearLeft.latitude);
nearLeftLocation.setLongitude(visibleRegion.nearLeft.longitude);
Location nearRightLocation = new Location("nearRightLocation");
nearRightLocation.setLatitude(visibleRegion.nearRight.latitude);
nearRightLocation.setLongitude(visibleRegion.nearRight.longitude);
float width = nearLeftLocation.distanceTo(nearRightLocation);
GroundOverlayOptions background = new GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))
.position(cameraPosition.target, width * 0.75f);
backgroundOverlay = map.addGroundOverlay(background);
}
}
UPDATE:
Come dico nei commenti possiamo e setDimensions
sulla esistente GroundOverlay
invece di aggiungere/rimuovere su ogni cambiamento della macchina fotografica.
L'ho provato su diversi dispositivi e sembra ridurre lo sfarfallio dei dispositivi di fascia bassa, ma non è ancora una soluzione perfetta (l'immagine si ridimensiona tra gli zoom). Sono abbastanza sicuro che questo è il meglio che possiamo ottenere usando GroundOverlay
s.
public class MyMapActivity extends Activity implements OnCameraChangeListener {
GroundOverlay backgroundOverlay = null;
GoogleMap map;
// ...
@Override
public void onCameraChange(final CameraPosition cameraPosition) {
VisibleRegion visibleRegion = map.getProjection().getVisibleRegion();
Location nearLeftLocation = new Location("nearLeftLocation");
nearLeftLocation.setLatitude(visibleRegion.nearLeft.latitude);
nearLeftLocation.setLongitude(visibleRegion.nearLeft.longitude);
Location nearRightLocation = new Location("nearRightLocation");
nearRightLocation.setLatitude(visibleRegion.nearRight.latitude);
nearRightLocation.setLongitude(visibleRegion.nearRight.longitude);
float width = nearLeftLocation.distanceTo(nearRightLocation);
if (backgroundOverlay == null) {
GroundOverlayOptions background = new GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))
.position(cameraPosition.target, width * 0.75f);
backgroundOverlay = map.addGroundOverlay(background);
} else {
backgroundOverlay.setPosition(cameraPosition.target);
backgroundOverlay.setDimensions(width * 0.75f);
}
}
}
UPDATE
ho trovato un'altra soluzione.Se lo sfondo è un colore semplice, semitrasparente, puoi utilizzare TileOverlay per impostarlo sotto tutti i marker.
L'idea è di creare un TileProvider che restituisca sempre un'immagine molto piccola (2x2 pixel nel mio esempio) che verrà disegnata sotto tutti i tuoi marcatori. Per garantire prestazioni, lo Tile
restituito dallo TileProvider
sarà sempre lo stesso.
Ecco il codice:
public class BackgroundTileProvider implements TileProvider {
private Tile tile;
@Override
public Tile getTile(int x, int y, int zoom) {
if (tile == null) {
// Create a very small (for performance) bitmap with alpha
Bitmap bmp = Bitmap.createBitmap(2, 2, Bitmap.Config.ARGB_8888);
// Draw the desired color to use as background
Canvas canvas = new Canvas(bmp);
canvas.drawColor(Color.argb(150, 255, 0, 0));
// Get the bytes and create the Tile
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
tile = new Tile(2, 2, stream.toByteArray());
}
return tile;
}
}
Sarà necessario aggiungere il TileOverlay alla mappa come segue:
TileProvider tileProvider = new BackgroundTileProvider();
TileOverlay tileOverlay = map.addTileOverlay(
new TileOverlayOptions().tileProvider(tileProvider));
Il risultato sarà simile a questa:
Perché non si imposta semplicemente un'icona personalizzata per gli indicatori? Avere un numero elevato di Marker e GroundOverlay nella tua mappa influisce sulle prestazioni, quindi cercherò di non impostare un Marker e un GroundOverlay dove ci dovrebbe essere solo un Marker – antonio
Ho delle icone personalizzate per i miei marcatori, ma ci dovrebbe essere UNO che io sto usando come sfondo; non è possibile quando si usano gli indicatori dato che non riesco a configurare uno z-index – swalkner
OK, scusa, non ho capito la tua domanda – antonio