web-dev-qa-db-fra.com

Modifier la taille du marqueur dans Google Maps API v2

J'essaie de porter mon application sur la toute nouvelle API Google Maps v2, mais je ne trouve pas comment modifier la taille du marqueur (certains de mes marqueurs sont plus petits que ceux par défaut).

En v1, j'ai utilisé un Drawable que j'ai mis à l'échelle avec setBounds() avant de l'ajouter à la carte.

Mais maintenant, en v2, je ne peux pas utiliser un Drawable. Je dois utiliser MarkerOptions().icon(), qui prend juste un BitmapDescriptor (généré avec un BitmapDescriptorFactory).

En regardant la référence, il ne semble pas y avoir de support pour la définition ou la modification de la taille BitmapDescriptor.

Alors, ai-je oublié quelque chose, ou est-il tout simplement impossible de définir la taille des marqueurs personnalisés dans cette version d'API?

30
jesjimher

Vous pouvez d'abord le convertir en Bitmap et changer sa taille, puis utiliser ce bitmap comme marqueur personnalisé. Par exemple, j'ai d'abord créé une méthode qui accepte le nom de votre fichier image dans un dossier dessinable, ainsi que la largeur et la hauteur du marqueur que vous souhaitez définir.

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

Appelez ensuite comme ceci dans la méthode setUpMap () pour créer un nouveau marqueur de la taille requise.

googleMap.addMarker(new MarkerOptions()
            .title("New Marker")
            .snippet("Check out this place.")
            .position(chelsea).icon(BitmapDescriptorFactory.fromBitmap(resizeMapIcons("image_name",100,100))));
48
anubh

La meilleure solution que j'ai trouvée est de redimensionner le Bitmap juste avant de l'ajouter en tant que Marker. Par exemple, dans mon code, j'utilise un LevelListDrawable qui fait référence à plusieurs Drawables à plusieurs résolutions. Puisque je veux des marqueurs demi-taille, je fais:

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

De cette façon, je peux continuer à utiliser Drawables tout en étant capable d'obtenir des marqueurs de tailles différentes en les convertissant simplement en Bitmap et en les redimensionnant selon les besoins.

17
jesjimher

Il semble que la seule façon de le faire soit de définir une image de marqueur personnalisée.

De Référence API : Si vous souhaitez changer plus que la couleur du marqueur, vous pouvez définir une image de marqueur personnalisée, souvent appelée icône. Les icônes personnalisées sont toujours définies comme BitmapDescriptor et définies à l'aide de l'une des quatre méthodes de la classe BitmapDescriptorFactory.

6
Chris Margonis
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;
}

La taille du bitmap revient à 80% de l'original.

Bitmap resizeBitmap = bitmapSizeByScall(originBitmap, 0.8f);
4
amiron

Juste un petit extrait qui fonctionne pour moi:

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;
}
1
Mike

Redimensionner l'image dessinable du marqueur

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

utiliser le bitmap dans l'icône de marqueur

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