Подтвердить что ты не робот

Изменение размера маркера в API Карт Google v2

Я пытаюсь перенести приложение в новый API Google Maps v2, но не могу найти, как изменить размер маркера (некоторые из моих маркеров меньше, чем по умолчанию).

В v1 я использовал Drawable, который я масштабировал с помощью setBounds(), прежде чем добавлять его к карте.

Но теперь, в v2, я не могу использовать Drawable. Я должен использовать MarkerOptions().icon(), который занимает всего BitmapDescriptor (сгенерированный с помощью BitmapDescriptorFactory).

Если посмотреть на ссылку, не существует поддержки для установки или изменения размера BitmapDescriptor.

Итак, я что-то пропустил, или просто невозможно установить размер для пользовательских маркеров в этой версии API?

4b9b3361

Ответ 1

Вы можете сначала преобразовать его в Bitmap и изменить его размер, а затем использовать это растровое изображение в качестве настраиваемого маркера. Например, я сначала создал метод, который принимает имя вашего файла изображения в папке с возможностью перемещения, а также ширину и высоту маркера, который вы хотите установить.

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

Ответ 2

Лучшее решение, которое я нашел, - это изменить размер Bitmap перед добавлением его как Marker. Например, в моем коде я использую LevelListDrawable, который ссылается на несколько Drawable s с несколькими разрешениями. Поскольку я хочу полуразрядные маркеры, я делаю:

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 и изменяя размер по мере необходимости.

Ответ 3

Кажется, единственный способ сделать это - установить пользовательское изображение Marker.

Из Справочник 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);

Ответ 5

Просто быстрый фрагмент, который работает для меня:

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