地図上に追加したいマーカーのマーカーアイコンとして、図形描画可能を追加しようとしています。
形状は次のようになります(res/drawable/blue_circle.xml):
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="oval" >
<size
Android:width="15dp"
Android:height="15dp" />
<solid
Android:color="@color/Blue" />
</shape>
そして私はこのようなマーカーを追加しようとします:
markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.blue_circle));
どうやら私はNullPointer例外を受け取ります。
マーカーアイコンはビットマップである必要がありますか?図形の描画可能オブジェクトをマーカーアイコンとして追加できますか?はいの場合、私は何を間違っていますか?
マーカーのドローアブルを作成します(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>
ドローアブルからビットマップを作成します。
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);
ビットマップを使用してマーカーを作成します。
Marker marker = mMap.addMarker(new MarkerOptions()
.position(point)
.anchor(.5f, .5f)
.icon(BitmapDescriptorFactory.fromBitmap(mDotMarkerBitmap)));
マーカーのサイズを寸法(res/values/dimens.xml)で設定します。
<resources>
<dimen name="map_dot_marker_size">12dp</dimen>
</resources>
_com.google.maps.Android:android-maps-utils
_ライブラリを使用している場合の回答は次のとおりです。
IconGenerator
を使用してビットマップを作成します
_IconGenerator iconGen = new IconGenerator(context);
// Define the size you want from dimensions file
int 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 size
View view = new View(context);
view.setLayoutParams(new ViewGroup.LayoutParams(shapeSize, shapeSize));
iconGen.setContentView(view);
// Create the bitmap
Bitmap bitmap = iconGen.makeIcon();
_
次に、マーカーアイコンを設定するときと同じようにビットマップを使用しますBitmapDescriptorFactory.fromBitmap(bitmap)
形状(xml)のドローアブルをマーカーアイコンとして扱う私の方法(saxmanの回答に基づく)。
地図上に表示するオブジェクト(マーカー)がたくさんあります。ビットマップとシェイプの両方の種類のドローアブルがあります。複数のマーカーに使用したのと同じアイコン。したがって、ビットマップ記述子とドローアブルタイプ検出用のキャッシュを追加しました。
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));
}
}
私のシェイプドローアブルにはサイズが設定されているため、ビットマップに必要なサイズをドローアブルにクエリできます。
<?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>