2013-02-13 3 views
27

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

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

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

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

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

+0

решенный. Если я использую меньшую «битмап», или если я конвертирую «Drawable» в «Bitmap» и масштабирую ее перед добавлением в качестве «маркера», я получаю меньший маркер со всеми преимуществами «Drawable's».Я отправлю пример, когда система позволит мне это сделать (я совершенно новый, и я должен подождать несколько часов, прежде чем ответить самому себе :-)). – jesjimher

ответ

6

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

От API Reference: Если вы хотите изменить не только цвет маркера, вы можете установить собственное изображение маркера, которое часто называют значком. Пользовательские значки всегда устанавливаются как BitmapDescriptor и определяются с использованием одного из четырех методов в классе BitmapDescriptorFactory.

+1

Вы правы, если я использую меньшую растровую карту (PNG с меньшим разрешением), маркер тоже меньше. Просто стыдно, что мы не можем использовать 'Drawable' напрямую, но это работает. Благодаря! – jesjimher

+0

Добро пожаловать :) Я столкнулся с той же проблемой, когда хотел нарисовать текст на своих маркерах. –

16

Лучшее решение, которое я нашел, - это изменить размер Bitmap перед добавлением его в Marker. Например, в моем коде я использую LevelListDrawable, который ссылается на несколько множественных разрешений 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

java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable нельзя отнести к android.graphics.drawable.LevelListDrawable –

1

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

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

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

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

Пример: mBitmap width = 100, а затем Bitmap asdas width = 80. – amiron

0

Изменение размера рисуем изображение маркера

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)) 
       ); 
Смежные вопросы