2013-02-13 120 views
27

我试图将我的应用移植到全新的Google Maps API v2,但无法找到如何更改标记的大小(我的一些标记比默认值小)。更改Google Maps API v2中的标记大小

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

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

看看参考文献,似乎没有任何设置或更改尺寸的支持。

那么,我是否遗漏了一些东西,或者在这个API版本中设置自定义标记的大小根本不可能?

+0

。如果我使用较小的“位图”,或者将“Drawable”转换为“位图”并在将其添加为“标记”之前对其进行缩放,则会得到一个更小的标记,并具有“可绘制”的所有优点。当系统允许我这样做时,我会发布一个示例(我很新,而且我必须等待几个小时才能回答自己:-))。 – jesjimher 2013-02-13 11:50:36

回答

6

它似乎是唯一的方法来做到这一点是通过设置自定义标记图像。

API Reference:如果您不想改变标记的颜色,可以设置自定义标记图像,通常称为图标。自定义图标始终设置为BitmapDescriptor,并使用BitmapDescriptorFactory类中的四种方法之一进行定义。

+1

你说得对,如果我使用较小的位图(较低分辨率的PNG),标记也会变小。只是一个耻辱,我们不能直接使用'Drawable's,但它的工作原理。谢谢! – jesjimher 2013-02-13 11:23:32

+0

不客气:) 当我想在我的标记上绘制文字时,我遇到了同样的问题。 – 2013-02-13 11:28:33

16

我发现的最佳解决方案是在将其作为Marker添加之前调整其大小Bitmap。例如,在我的代码中,我使用了一个参考几个多分辨率Drawable s的LevelListDrawable。因为我想一半大小的标记,我做的:

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,并根据需要调整。

+17

java.lang.ClassCastException:android.graphics.drawable.BitmapDrawable无法转换为android.graphics.drawable.LevelListDrawable – 2013-06-22 10:52:08

1

只是一个快速的片段,对我的作品:

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

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

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()方法中调用此方法,以创建所需大小的新标记。

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

位图大小恢复到原来的80%。

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

示例:mBitmap width = 100,则位图asdas width = 80。 – amiron 2016-07-15 12:57:16

0

调整标记

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

的可绘制的图像使用该位图中解决的标记图标

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