アプリを最新のGoogle Maps API v2に移植しようとしていますが、マーカーのサイズを変更する方法が見つかりません(一部のマーカーはデフォルトより小さい)。
V1では、マップに追加する前にsetBounds()
でスケーリングしたDrawable
を使用しました。
しかし今、v2では、Drawable
を使用できません。 MarkerOptions().icon()
を使用する必要がありますが、これはBitmapDescriptor
(BitmapDescriptorFactory
で生成された)のみを受け取ります。
参照を見ると、BitmapDescriptor
サイズの設定または変更のサポートはないようです。
だから、私は何かを見逃したことがありますか、このAPIバージョンでカスタムマーカーのサイズを設定することはまったく不可能ですか?
最初にビットマップに変換し、サイズを変更してから、そのビットマップをカスタムマーカーとして使用できます。たとえば、最初に、描画可能なフォルダー内の画像ファイルの名前、および設定するマーカーの幅と高さを受け入れるメソッドを作成しました。
public Bitmap resizeMapIcons(String iconName,int width, int height){
Bitmap imageBitmap = BitmapFactory.decodeResource(getResources(),getResources().getIdentifier(iconName, "drawable", getPackageName()));
Bitmap resizedBitmap = Bitmap.createScaledBitmap(imageBitmap, width, height, false);
return resizedBitmap;
}
次に、setUpMap()メソッドでこのように呼び出して、必要なサイズの新しいマーカーを作成します。
googleMap.addMarker(new MarkerOptions()
.title("New Marker")
.snippet("Check out this place.")
.position(chelsea).icon(BitmapDescriptorFactory.fromBitmap(resizeMapIcons("image_name",100,100))));
私が見つけた最善の解決策は、Bitmap
として追加する直前にMarker
のサイズを変更することです。たとえば、私のコードでは、複数の解像度を持つLevelListDrawable
sを参照するDrawable
を使用しています。私はハーフサイズのマーカーが欲しいので、私はそうします:
LevelListDrawable d=(LevelListDrawable) getResources().getDrawable(R.drawable.estado_variable);
d.setLevel(1234);
BitmapDrawable bd=(BitmapDrawable) d.getCurrent();
Bitmap b=bd.getBitmap();
Bitmap bhalfsize=Bitmap.createScaledBitmap(b, b.getWidth()/2,b.getHeight()/2, false);
mapa.addMarker(new MarkerOptions()
.position(POSITION)
.title("Title")
.icon(BitmapDescriptorFactory.fromBitmap(bhalfsize))
);
このように、Drawables
を使用し続けることができ、同時にそれらをBitmap
に変換し、必要に応じてサイズを変更するだけで、異なるサイズのマーカーを取得できます。
それを行う唯一の方法は、カスタムマーカー画像を設定することです。
差出人 APIリファレンス :マーカーの色だけを変更したくない場合は、アイコンと呼ばれるカスタムマーカー画像を設定できます。カスタムアイコンは常にBitmapDescriptor
として設定され、BitmapDescriptorFactory
クラスの4つのメソッドのいずれかを使用して定義されます。
public Bitmap bitmapSizeByScall( Bitmap bitmapIn, float scall_zero_to_one_f) {
Bitmap bitmapOut = Bitmap.createScaledBitmap(bitmapIn,
Math.round(bitmapIn.getWidth() * scall_zero_to_one_f),
Math.round(bitmapIn.getHeight() * scall_zero_to_one_f), false);
return bitmapOut;
}
ビットマップサイズは元の80%に戻ります。
Bitmap resizeBitmap = bitmapSizeByScall(originBitmap, 0.8f);
私のために働く簡単なスニペット:
private Bitmap scaleImage(Resources res, int id, int lessSideSize) {
Bitmap b = null;
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, id, o);
float sc = 0.0f;
int scale = 1;
// if image height is greater than width
if (o.outHeight > o.outWidth) {
sc = o.outHeight / lessSideSize;
scale = Math.round(sc);
}
// if image width is greater than height
else {
sc = o.outWidth / lessSideSize;
scale = Math.round(sc);
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
b = BitmapFactory.decodeResource(res, id, o2);
return b;
}
マーカーの描画可能な画像のサイズを変更します
int height = 80;
int width = 60;
BitmapDrawable bitmapdraw=(BitmapDrawable)getResources().getDrawable(R.mipmap.marker);
Bitmap b=bitmapdraw.getBitmap();
Bitmap smallMarker = Bitmap.createScaledBitmap(b, width, height, false);
マーカーアイコンでビットマップを使用する
map.addMarker(new MarkerOptions()
.position(POSITION)
.title("Your title")
.icon(BitmapDescriptorFactory.fromBitmap(smallMarker))
);