2013-02-13 6 views
27

Sto provando a trasferire la mia app alla nuovissima API di Google Maps v2, ma non riesco a trovare come modificare la dimensione dell'indicatore (alcuni dei miei indicatori sono più piccoli di quelli predefiniti).Modifica la dimensione dell'indicatore nell'API di Google Maps v2

Nella v1, ho utilizzato uno Drawable che ho ridimensionato con setBounds() prima di aggiungerlo alla mappa.

Ma ora, nella v2, non posso usare uno Drawable. Devo usare MarkerOptions().icon(), che richiede solo un BitmapDescriptor (generato con un BitmapDescriptorFactory).

Guardando il riferimento, non sembra esserci alcun supporto per l'impostazione o la modifica della dimensione BitmapDescriptor.

Quindi, mi sono perso qualcosa o è semplicemente impossibile impostare le dimensioni per i marcatori personalizzati in questa versione API?

+0

risolto. Se uso un 'Bitmap' più piccolo, o se converto un' Drawable' in 'Bitmap' e lo ridimensiono prima di aggiungerlo come' Marker', ottengo un marker più piccolo con tutti i vantaggi di 'Drawable's.Pubblicherò un esempio quando il sistema mi consente di farlo (sono abbastanza nuovo e devo aspettare qualche ora prima di rispondere a me stesso :-)). – jesjimher

risposta

6

Sembra che l'unico modo per farlo è impostare un'immagine personalizzata Marker.

Da API Reference: Se desideri modificare più del semplice colore del marcatore, puoi impostare un'immagine di marcatore personalizzata, spesso chiamata un'icona. Le icone personalizzate sono sempre impostate come BitmapDescriptor e definite utilizzando uno dei quattro metodi nella classe BitmapDescriptorFactory.

+1

Hai ragione, se uso una bitmap più piccola (PNG a risoluzione inferiore), anche il marcatore è più piccolo. Peccato che non possiamo usare 'Drawable's direttamente, ma funziona. Grazie! – jesjimher

+0

Prego :) Ho affrontato lo stesso problema quando volevo disegnare il testo sui miei pennarelli. –

16

La soluzione migliore che ho trovato è ridimensionare lo Bitmap appena prima di aggiungerlo come Marker. Ad esempio, nel mio codice utilizzo uno LevelListDrawable che fa riferimento a più risoluzioni Drawable s. Dal momento che voglio Marcatori half-size, che faccio:

LevelListDrawable d=(LevelListDrawable) getResources().getDrawable(R.drawable.estado_variable); 
d.setLevel(1234); 
BitmapDrawable bd=(BitmapDrawable) d.getCurrent(); 
Bitmap b=bd.getBitmap(); 
Bitmap bhalfsize=Bitmap.createScaledBitmap(b, b.getWidth()/2,b.getHeight()/2, false); 
mapa.addMarker(new MarkerOptions() 
     .position(POSITION) 
     .title("Title") 
     .icon(BitmapDescriptorFactory.fromBitmap(bhalfsize)) 
     ); 

In questo modo, posso continuare ad usare Drawables mentre potuto ottenere in modo diverso marcatori dimensioni semplicemente convertirli in Bitmap e il ridimensionamento in base alle esigenze.

+17

java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable non può essere trasmesso su android.graphics.drawable.LevelListDrawable –

1

Solo una breve frammento che funziona per me:

private Bitmap scaleImage(Resources res, int id, int lessSideSize) { 
    Bitmap b = null; 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 

    BitmapFactory.decodeResource(res, id, o); 

    float sc = 0.0f; 
    int scale = 1; 
    // if image height is greater than width 
    if (o.outHeight > o.outWidth) { 
     sc = o.outHeight/lessSideSize; 
     scale = Math.round(sc); 
    } 
    // if image width is greater than height 
    else { 
     sc = o.outWidth/lessSideSize; 
     scale = Math.round(sc); 
    } 

    // Decode with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize = scale; 
    b = BitmapFactory.decodeResource(res, id, o2); 
    return b; 
} 
39

È possibile prima convertirla in bitmap e modificarne le dimensioni e quindi utilizzare tale bitmap come marcatore personalizzato. Ad esempio, ho creato per la prima volta un metodo che accetta il nome del file immagine in una cartella disegnabile e la larghezza e l'altezza del marcatore che si desidera impostare.

public Bitmap resizeMapIcons(String iconName,int width, int height){ 
    Bitmap imageBitmap = BitmapFactory.decodeResource(getResources(),getResources().getIdentifier(iconName, "drawable", getPackageName())); 
    Bitmap resizedBitmap = Bitmap.createScaledBitmap(imageBitmap, width, height, false); 
    return resizedBitmap; 
} 

quindi chiamare come questo in setUpMap() per creare un nuovo marcatore di dimensioni richieste.

googleMap.addMarker(new MarkerOptions() 
      .title("New Marker") 
      .snippet("Check out this place.") 
      .position(chelsea).icon(BitmapDescriptorFactory.fromBitmap(resizeMapIcons("image_name",100,100)))); 
2
public Bitmap bitmapSizeByScall(Bitmap bitmapIn, float scall_zero_to_one_f) { 

    Bitmap bitmapOut = Bitmap.createScaledBitmap(bitmapIn, 
      Math.round(bitmapIn.getWidth() * scall_zero_to_one_f), 
      Math.round(bitmapIn.getHeight() * scall_zero_to_one_f), false); 

    return bitmapOut; 
} 

dimensioni bitmap torna al 80% dell'originale.

Bitmap resizeBitmap = bitmapSizeByScall(originBitmap, 0.8f); 
+0

Esempio: mBitmap width = 100, quindi Bitmap asdas width = 80. – amiron

0

ridimensionare l'immagine drawable di marcatore

int height = 80; 
int width = 60; 
BitmapDrawable bitmapdraw=(BitmapDrawable)getResources().getDrawable(R.mipmap.marker); 
Bitmap b=bitmapdraw.getBitmap(); 
Bitmap smallMarker = Bitmap.createScaledBitmap(b, width, height, false); 

utilizzare il bitmap in pennarello icona

map.addMarker(new MarkerOptions() 
       .position(POSITION) 
       .title("Your title") 
       .icon(BitmapDescriptorFactory.fromBitmap(smallMarker)) 
       );