1. ホーム
  2. android

[解決済み] ベクターアセットアイコンを使ったアンドロイドのグーグルマップのカスタムマーカー

2023-03-04 20:56:26

質問

マップマーカーアイコンに ベクターアセット ファイルで、googleがこのように表示する方法を、プログラム的に実現することができます。

更新しました。

map.addMarker(new MarkerOptions()
    .position(latLng)
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_vector_asset))
    .title(title);

は、ベクターアセットを扱うときには機能しません。質問する主な理由 上記のコードでのエラーです。

java.lang.IllegalArgumentException: 画像のデコードに失敗しました。提供された画像はBitmapである必要があります。

どのように解決するのですか?

私はまったく同じ要件を探していて、この質問を見て最初はうれしかったのですが、@Shuddhと同じように、与えられた答えに満足しませんでした。

私の話を短くするために、私はこの要件に次のコードを使用しています。

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);
}

と使用例を示します。

.icon(bitmapDescriptorFromVector(this, R.drawable.ic_car_white_24dp));

注:ベクターには別のバウンディングを使用するとよいでしょう。私のベクターは24dpのサイズで、背景として48dpのpng画像(青い部分、これもベクターになり得ます)を使用しました。

UPDATE: リクエストがあったのでスクリーンショットを追加しました。