25

マップに追加したいマーカーのマーカーアイコンとしてシェイプドローブブルを追加しようとしていました。Google Maps API v2 Androidのシェイプドローブをマーカーとして追加する

形状はこれ(RES /描画可能/ 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例外を取得します。

マーカーアイコンはビットマップである必要がありますか? シェイプドロアブルをマーカーアイコンとして追加することはできますか? もしそうなら、私は何が間違っていますか?

答えて

33

あなたのマーカーの描画可能(RES /描画可能/ 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))); 

マーカーのサイズをdimens(res/values/dimens.xml)に設定します。

<resources> 
    <dimen name="map_dot_marker_size">12dp</dimen> 
</resources> 
0

私のやり方は、(サックスマンの回答に基づいて)マーカーアイコンとしてshape(xml)のドロワーブルを扱う方法です。

マップ上に表示するオブジェクト(マーカー)がたくさんあります。彼らには、ビットマップとシェイプの両方のドロアブルがあります。複数のマーカーで同じアイコンを使用しています。したがって、私はビットマップ記述子と描画可能な型検出のためにいくつかのキャッシュを追加しました。

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

私の形状drawableはサイズを設定しているので、ビットマップのために望ましいサイズのdrawableを問い合わせることができます。

<?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> 
2

com.google.maps.android:android-maps-utilsライブラリを使用している場合の回答です。

マーカーアイコンBitmapDescriptorFactory.fromBitmap(bitmap)

を設定するときのようにビットマップを使用します次に 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(); 

を使用してビットマップを作成します。

関連する問題