Google Maps API v2 Android add shape drawable as marker
Create a drawable for your marker (res/drawable/map_dot_red.xml):
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <gradient android:angle="90" android:endColor="#f58383" android:startColor="#ee6464" /> <stroke android:width="1dp" android:color="#a13939" /></shape>
Create a bitmap from the drawable:
int px = getResources().getDimensionPixelSize(R.dimen.map_dot_marker_size);mDotMarkerBitmap = Bitmap.createBitmap(px, px, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(mDotMarkerBitmap);Drawable shape = getResources().getDrawable(R.drawable.map_dot_red);shape.setBounds(0, 0, mDotMarkerBitmap.getWidth(), mDotMarkerBitmap.getHeight());shape.draw(canvas);
Create your marker, using the bitmap:
Marker marker = mMap.addMarker(new MarkerOptions() .position(point) .anchor(.5f, .5f) .icon(BitmapDescriptorFactory.fromBitmap(mDotMarkerBitmap)));
Set the size of your marker in dimens (res/values/dimens.xml):
<resources> <dimen name="map_dot_marker_size">12dp</dimen></resources>
Here's an answer if you're using the com.google.maps.android:android-maps-utils
library.
Create a Bitmap using IconGenerator
IconGenerator iconGen = new IconGenerator(context);// Define the size you want from dimensions fileint shapeSize = getResources().getDimensionPixelSize(R.dimen.shape_size);Drawable shapeDrawable = ResourcesCompat.getDrawable(getResources(), R.drawable.my_shape, null);iconGen.setBackground(shapeDrawable);// Create a view container to set the sizeView view = new View(context);view.setLayoutParams(new ViewGroup.LayoutParams(shapeSize, shapeSize));iconGen.setContentView(view);// Create the bitmapBitmap bitmap = iconGen.makeIcon();
Then use the bitmap like you would when setting the marker icon BitmapDescriptorFactory.fromBitmap(bitmap)
My way to deal with shape (xml) drawables as marker icons (based on saxman answer).
I have a lot of objects (markers) to show on map. They have both kinds of drawables – bitmap and shape. The same icon my used for multiple markers. Thus, I have added some caching for bitmap descriptors and drawable type detection.
SparseArray<BitmapDescriptor> iconCache = new SparseArray<>();for (MyObject object : objects) { int iconResId = object.icon; BitmapDescriptor icon = iconCache.get(iconResId); if (icon == null) { Drawable drawable; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { drawable = getResources().getDrawable(iconResId, null); } else { drawable = getResources().getDrawable(iconResId); } if (drawable instanceof GradientDrawable) { Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight()); drawable.draw(canvas); icon = BitmapDescriptorFactory.fromBitmap(bitmap); bitmap.recycle(); } else { icon = BitmapDescriptorFactory.fromResource(iconResId); } iconCache.put(iconResId, icon); map.addMarker(new MarkerOptions() .icon(icon) .position(position)); }}
My shape drawable have set size, thus, I can query drawable for desired size for bitmap.
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:width="12dp" android:height="12dp" /> <solid android:color="@color/transit_bus" /></shape>