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?
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))));
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 Drawable
s à 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.
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
.
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);
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;
}
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))
);