Android Google Maps API v2 - 如何更改标记图标

38

我正在尝试更改标记的图标。 我从一个服务器目录获取图片。

每次我设置断点时,“bit”结果都是null。当我运行应用程序时,我会得到java.lang.NullPointerException

File file = new File("J:\\!!! DOCUMENTS\\!Outsourcing\\AppStore\\Benzinostancii\\Petrol\\logo.png");

Bitmap bit = BitmapFactory.decodeFile(String.valueOf(file));

double Dlat = lat.get(index);
double Dlon = lon.get(index);
String info = Arrayinfo.get(index);
String name = Arrayname.get(index);

LatLng coordinate = new LatLng(Dlat, Dlon);
map.addMarker(new MarkerOptions()
    .icon(BitmapDescriptorFactory.fromBitmap(bit))
    .position(coordinate)
    .title(info)
).setSnippet(name);

J目录是安卓设备内部存储器中的目录吗?为什么不将其放在drawable文件夹中? - Ariel Magbanua
这个 J 目录来自 PC 服务器,我想从这个服务器加载图像。 - cross_fire
1
哦,我认为那样做不可能。你可能需要先从服务器下载图像,然后再使用它。 - Ariel Magbanua
9个回答

85
// latitude and longitude
double latitude = 17.385044;
double longitude = 78.486671;

// create marker
MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Hello Maps");

// Changing marker icon
marker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker_icon)));

// adding marker
googleMap.addMarker(marker);

更多信息


我认为你在第9行加了一个 )。 - The random guy
1
可能是指 setIcon() - crmepham
6
您确定setIcon在新的Google API上可用吗?我认为不是这样。 - Amir Ziarati
此解决方案已不再有效。 - stodi
使用 googleMap.addMarker(new MarkerOptions().position(new LatLng(35.699262, 51.345184)).title("your_title").icon(bitmapDescriptorFromVector(getApplicationContext(), R.drawable.your_drawable))); - hassan moradnezhad

19

很简单:

new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.icon))

如果你想从一个位图获取图标

new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(bitmap));

你有新的解决方案吗?请在@DanAnderson处提交答案。 - Arash Hatami
我在评论时并不知道,但是我后来弄明白了,所以我想我可以把它发布出来,以防像我一样的人从谷歌搜索中找到它。 - Dan Anderson
你的图标尺寸是多少? - Arjun
1
16或32像素是标记的最佳尺寸...适合所有屏幕的美观视图@Arjun - Arash Hatami

14

使用.icon()像这样添加

Marker marker = map.addMarker(new MarkerOptions().position(currentLocation)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_place_holder)));

请注意不要使用矢量图像,如果您想使用矢量,请使用以下代码

private BitmapDescriptor bitmapDescriptorFromVector(Context context, @DrawableRes  int vectorDrawableResourceId) {
    Drawable background = ContextCompat.getDrawable(context, R.drawable.ic_map_pin_filled_blue_48dp);
    background.setBounds(0, 0, background.getIntrinsicWidth(), background.getIntrinsicHeight());
    Drawable vectorDrawable = ContextCompat.getDrawable(context, vectorDrawableResourceId);
    vectorDrawable.setBounds(40, 20, vectorDrawable.getIntrinsicWidth() + 40, vectorDrawable.getIntrinsicHeight() + 20);
    Bitmap bitmap = Bitmap.createBitmap(background.getIntrinsicWidth(), background.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    background.draw(canvas);
    vectorDrawable.draw(canvas);
    return BitmapDescriptorFactory.fromBitmap(bitmap);
}

12
在较新版本的GoogleMaps for Android中,您无法在MarkerOptions对象上调用.setIcon()。相反,您需要将标记选项添加到地图中,这将为您提供一个Marker,然后您可以更改其图标。
在Kotlin中,代码如下:
val markerOptions = MarkerOptions()
markerOptions.position(LatLng(40.419900, -111.880767))
val marker: Marker?  = googleMap?.addMarker(markerOptions)
val bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.marker_customer_symbol)
marker?.setIcon(bitmapDescriptor)

1
对于Xamarin C#用户:

tappedMarker.Remove();
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.SetTitle(tappedMarker.Title);
markerOptions.SetPosition(tappedMarker.Position);

markerOptions.SetIcon(BitmapDescriptorFactory.DefaultMarker(BitmapDescriptorFactory.HueGreen));
tappedMarker = googleMap.AddMarker(markerOptions);

方法名从不以大写字母开头。这些方法并不存在。 - Daksh Gargas
1
@Dennis 嗯,这适用于 C#,但这是 Xamarin 版本,只需将相同的代码转换为 Java,使用相同的命名法即可。 - Gustavo Baiocchi Costa
1
好的,但是这些方法不存在。 - Daksh Gargas
@Dennis,是的,它们确实存在。Gustavo正在谈论c# Xamarin。这就是你在c#中需要处理的方式。 - Cameron Forward
哦,但我们在这里谈论的是Android->JAVA,他不应该用任何其他格式回答,对吧? - Daksh Gargas
有点类似。这是同一个主题,所以那些在寻找Xamarin版本的相同解决方案的人会找到它。但方法名称是相同的,只需将 SetTitle 更改为 setTitle 即可! - Gustavo Baiocchi Costa

0

试试这个,

  BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.location);
            LatLng bangalore = new LatLng(12.9716, 77.5946);

 MarkerOptions markerOptions = new MarkerOptions().position(bangalore)
          .title("Current Location")
            .snippet("hello").icon(icon);


 mMap.addMarker(markerOptions);

不要使用 drawable 中存在的 XML 文件,使用 PNG 文件以获得结果。 - Rishav

0
   val marker = googleMap?.addMarker {
        position(LatLng(24.774265, 46.738586))
        title("Saudi Arabia")
        draggable(true)
        icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_address_location))
    }

0

在 "onMapReady(GoogleMap googleMap)" 方法内

MarkerOptions marker = new MarkerOptions();
marker.icon(BitmapDescriptorFactory.fromResource(R.drawable._icon));

你是指setIcon吗? - Daniel Beltrami

-1
      mMap = googleMap;
 LatLng sydney = new LatLng(Lat,Lng);
       mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney").icon(BitmapDescriptorFactory.fromResource(R.drawable.icon)));
 mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney,12.0f));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接