在 GoogleMap 版本2中将图像从可绘制的位置设置为标记

我使用这部分代码在谷歌地图版本2的 MapFragment中添加一个标记。

MarkerOptions op = new MarkerOptions();
op.position(point)
.title(Location_ArrayList.get(j).getCity_name())
.snippet(Location_ArrayList.get(j).getVenue_name())
.draggable(true);
m = map.addMarker(op);
markers.add(m);

我想使用不同的图像从我的绘制。

94302 次浏览

This is how you can set a Drawable as a Marker.

BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.current_position_tennis_ball)


MarkerOptions markerOptions = new MarkerOptions().position(latLng)
.title("Current Location")
.snippet("Thinking of finding some thing...")
.icon(icon);


mMarker = googleMap.addMarker(markerOptions);

VectorDrawables and XML based Drawables do not work with this.

If you have Drawable created programatically (so you have no resource for it), you can use this:

Drawable d = ... // programatically create drawable
Canvas canvas = new Canvas();
Bitmap bitmap = Bitmap.createBitmap(d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
d.draw(canvas);
BitmapDescriptor bd = BitmapDescriptorFactory.fromBitmap(bitmap);

Then you have BitmapDescriptor, which you can pass into MarkerOptions.

@Lukas Novak answer is not showing anything because you also have to set the bounds on Drawable.
This works for any drawable. Here is a fully working example:

public void drawMarker() {
Drawable circleDrawable = getResources().getDrawable(R.drawable.circle_shape);
BitmapDescriptor markerIcon = getMarkerIconFromDrawable(circleDrawable);


googleMap.addMarker(new MarkerOptions()
.position(new LatLng(41.906991, 12.453360))
.title("My Marker")
.icon(markerIcon)
);
}


private BitmapDescriptor getMarkerIconFromDrawable(Drawable drawable) {
Canvas canvas = new Canvas();
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return BitmapDescriptorFactory.fromBitmap(bitmap);
}


circle_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<size android:width="20dp" android:height="20dp"/>
<solid android:color="#ff00ff"/>
</shape>

Basically use bitmap insted of drawable. If you do have a drawable, convert it to bitmap.
Here is a code example in kotlin.

private fun placeNewMarker(whereToPlaceYourMarker: LatLng){


val pickupMarkerDrawable = resources.getDrawable(R.drawable.your_marker_drawable,null)




_pickupMarker =   mMap?.addMarker(MarkerOptions()
.position(whereToPlaceYourMarker)
.draggable(true)
.title("My Marker")
.icon(BitmapDescriptorFactory.fromBitmap(pickupMarkerDrawable.toBitmap(pickupMarkerDrawable.intrinsicWidth, pickupMarkerDrawable.intrinsicHeight, null))))






}

If you are using vector drawable use this extension:

fun  Context.bitmapDescriptorFromVector(vectorResId:Int): BitmapDescriptor {
val vectorDrawable = ContextCompat.getDrawable(this, vectorResId)
vectorDrawable!!.setBounds(0, 0, vectorDrawable.intrinsicWidth, vectorDrawable.intrinsicHeight)
val bitmap = Bitmap.createBitmap(vectorDrawable.intrinsicWidth, vectorDrawable.intrinsicHeight, Bitmap.Config.ARGB_8888)
vectorDrawable.draw(Canvas(bitmap))
return BitmapDescriptorFactory.fromBitmap(bitmap)
}

And set to the marker icon:

val markerOptions = MarkerOptions().position(latLng)
.title("Current Location")
.snippet("Thinking of finding some thing...")
.icon(bitmapDescriptorFromVector("Your icon resource id"))// call extension here


mMarker = googleMap.addMarker(markerOptions)