【问题标题】:Change marker size in Google Maps API v2在 Google Maps API v2 中更改标记大小
【发布时间】:2013-01-28 21:16:17
【问题描述】:

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

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

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

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

那么,是我遗漏了什么,还是根本不可能在这个 API 版本中设置自定义标记的大小?

【问题讨论】:

  • 已解决。如果我使用较小的Bitmap,或者如果我将Drawable 转换为Bitmap 并在将其添加为Marker 之前对其进行缩放,我会得到一个具有Drawables 的所有优点的更小的标记。当系统允许我这样做时,我将发布一个示例(我很新,我必须等待几个小时才能回答自己:-))。

标签: android android-maps-v2


【解决方案1】:

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

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】:

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

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

    【讨论】:

    • java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable 不能转换为 android.graphics.drawable.LevelListDrawable
    【解决方案3】:

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

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

    【讨论】:

    • 你是对的,如果我使用较小的位图(较低分辨率的 PNG),标记也会更小。可惜我们不能直接使用Drawables,但它可以工作。谢谢!
    • 不客气 :) 当我想在我的标记上绘制文本时,我遇到了同样的问题。
    • 我有一张小地图,标记的高度与我的 MapView 相同:(
    【解决方案4】:
    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);
    

    【讨论】:

    • 示例:mBitmap width = 100,然后 Bitmap asdas width = 80。
    【解决方案5】:

    只是一个适合我的快速 sn-p:

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

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多