KickingLettuce KickingLettuce - 5 months ago 74
Android Question

Using an xml Layout for a Google Map Marker for Android

I want to use a layout and not a drawable for my

marker
I am using with Google Maps Api 2 for an Android app.

Like this:

Marker m = googleMap
.addMarker(new MarkerOptions()
.position(LOC)
.snippet(user)
.title(name)
.icon(BitmapDescriptorFactory.fromResource(R.layout.map_marker)));


However, it seems this is only designed for use from
drawable
folder.

I simply what an image with a background where I can change colors based on marker type. This is the layout I want to use:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="#222"
android:id="@+id/llMarker">

<ImageView
android:id="@+id/ivMarker"
android:layout_marginTop="5dp"
android:layout_width="40dp"
android:layout_height="40dp" />

</LinearLayout>


Pretty basic. How can I use this as a marker? (or at least replicate the end result that I am going for?)

The documents say you can use this:

fromResource (int resourceId)


So I assumed a layout might work.

UPDATE:

I have taken the concept from answer below and reworked some things; this still is not working; no errors. Just will not show image.

LayoutInflater inflater = (LayoutInflater) getActivity()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.map_marker, null);

m = googleMap
.addMarker(new MarkerOptions()
.position(LOC)
.snippet(user)
.title(name)
.icon(BitmapDescriptorFactory.fromBitmap(loadBitmapFromView(v))));


// method

public static Bitmap loadBitmapFromView(View v) {

if (v.getMeasuredHeight() <= 0) {
v.measure(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
v.draw(c);
return b;
}
return null;
}

Answer

You cannot directly use a layout with BitmapDescriptorFactory.fromResource():

Creates a BitmapDescriptor using the resource id of an image.

However, you could draw the layout into a bitmap, and then use that. You'd need to:

  • Inflate the layout from xml (with a LayoutInflater).
  • Change whatever properties you want (e.g. background color).
  • Render this layout into a Bitmap, via Canvas, for example as described here.
  • Pass this bitmap into BitmapDescriptorFactory.fromBitmap().