Изменение размера маркера в API Карт Google v2
Я пытаюсь перенести приложение в новый API Google Maps v2, но не могу найти, как изменить размер маркера (некоторые из моих маркеров меньше, чем по умолчанию).
В v1 я использовал Drawable
, который я масштабировал с помощью setBounds()
, прежде чем добавлять его к карте.
Но теперь, в v2, я не могу использовать Drawable
. Я должен использовать MarkerOptions().icon()
, который занимает всего BitmapDescriptor
(сгенерированный с помощью BitmapDescriptorFactory
).
Если посмотреть на ссылку, не существует поддержки для установки или изменения размера BitmapDescriptor
.
Итак, я что-то пропустил, или просто невозможно установить размер для пользовательских маркеров в этой версии API?
Ответы
Ответ 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;
}