关于android:在Google Maps API v2中更改标记大小

Change marker size in Google Maps API v2

我正在尝试将我的应用程序移植到全新的Google Maps API v2,但找不到如何更改标记的大小(我的一些标记小于默认值)。

在v1中,我使用了Drawable,并在将其添加到地图之前使用setBounds()对其进行了缩放。

但是现在,在v2中,我不能使用Drawable。我必须使用MarkerOptions().icon(),它只需一个BitmapDescriptor(由BitmapDescriptorFactory生成)。

看参考文献,似乎不支持设置或更改BitmapDescriptor大小。

那么,我是否错过了一些东西,还是在此API版本中设置自定义标记的大小完全不可能?


您可以先将其转换为位图并更改其大小,然后将该位图用作自定义标记。例如,我首先创建了一个方法,该方法接受可绘制文件夹中图像文件的名称以及要设置的标记的宽度和高度。

1
2
3
4
5
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;
}

然后在setUpMap()方法中这样调用以创建所需大小的新标记。

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

我发现的最佳解决方案是在将Bitmap添加为Marker之前调整其大小。例如,在我的代码中,我使用了LevelListDrawable,它引用了多个多分辨率的Drawable。由于我想要一半大小的标记,所以我要做:

1
2
3
4
5
6
7
8
9
10
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))
        );

这样,我可以继续使用Drawables,同时能够获得大小不同的标记,只需将它们转换为Bitmap并根据需要调整大小即可。


似乎唯一的方法是设置自定义标记图像。

摘自《 API参考》:如果您不仅要更改标记的颜色,还可以设置自定义标记图像,通常称为图标。自定义图标始终设置为BitmapDescriptor,并使用BitmapDescriptorFactory类中的四种方法之一进行定义。


1
2
3
4
5
6
7
8
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;
}

位图大小恢复为原始大小的80%。

1
Bitmap resizeBitmap = bitmapSizeByScall(originBitmap, 0.8f);


一个对我有用的快速摘要:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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;
}