web-dev-qa-db-ja.com

Google Maps API v2でマーカーサイズを変更する

アプリを最新のGoogle Maps API v2に移植しようとしていますが、マーカーのサイズを変更する方法が見つかりません(一部のマーカーはデフォルトより小さい)。

V1では、マップに追加する前にsetBounds()でスケーリングしたDrawableを使用しました。

しかし今、v2では、Drawableを使用できません。 MarkerOptions().icon()を使用する必要がありますが、これはBitmapDescriptorBitmapDescriptorFactoryで生成された)のみを受け取ります。

参照を見ると、BitmapDescriptorサイズの設定または変更のサポートはないようです。

だから、私は何かを見逃したことがありますか、このAPIバージョンでカスタムマーカーのサイズを設定することはまったく不可能ですか?

30
jesjimher

最初にビットマップに変換し、サイズを変更してから、そのビットマップをカスタムマーカーとして使用できます。たとえば、最初に、描画可能なフォルダー内の画像ファイルの名前、および設定するマーカーの幅と高さを受け入れるメソッドを作成しました。

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))));
48
anubh

私が見つけた最善の解決策は、Bitmapとして追加する直前にMarkerのサイズを変更することです。たとえば、私のコードでは、複数の解像度を持つLevelListDrawablesを参照する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に変換し、必要に応じてサイズを変更するだけで、異なるサイズのマーカーを取得できます。

17
jesjimher

それを行う唯一の方法は、カスタムマーカー画像を設定することです。

差出人 APIリファレンス :マーカーの色だけを変更したくない場合は、アイコンと呼ばれるカスタムマーカー画像を設定できます。カスタムアイコンは常にBitmapDescriptorとして設定され、BitmapDescriptorFactoryクラスの4つのメソッドのいずれかを使用して定義されます。

6
Chris Margonis
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);
4
amiron

私のために働く簡単なスニペット:

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;
}
1
Mike

マーカーの描画可能な画像のサイズを変更します

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))
                );
1
Bilal Ahmad