Использовать макет как OverlayItem на MapView? - PullRequest
1 голос
/ 24 июля 2010

Можно ли использовать макет, определенный в XML, как OverlayItem, который будет добавлен в MapView, а не только в виде единственного объекта рисования?У меня есть несколько оверлеев, нарисованных на карте, но это просто отдельные изображения, теперь я хотел бы разместить наложения, которые являются более сложными объектами, а не просто прорисовываемыми.

Я планирую нарисовать маркер сдинамическое изображение внутри него (просто вещь типа локатора друга), где каждый маркер имеет различную картинку внутри.

Добавляет ли это как OverlayItems, или мне нужно добавить каждый из них в MapViewкак детский взгляд (кажется, что это было бы неэффективно)?

Ответы [ 2 ]

0 голосов
/ 23 июля 2014

Мне удалось добавить макет в качестве маркера на карте, преобразовав макет в чертежный. Вот bitmapFromView функция взята из этого урока :

public static Bitmap bitmapFromView(View layout, int width, int height, Context context) {
    // Create a new bitmap and a new canvas using that bitmap
    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bmp);
    layout.setDrawingCacheEnabled(true);
    // Supply measurements
    layout.measure(View.MeasureSpec.makeMeasureSpec(canvas.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(canvas.getHeight(), View.MeasureSpec.EXACTLY));
    // Apply the measures so the layout would resize before drawing.
    layout.layout(0, 0, layout.getMeasuredWidth(), layout.getMeasuredHeight());
    // and now the bmp object will actually contain the requested layout
    canvas.drawBitmap(layout.getDrawingCache(), 0, 0, new Paint());
    return bmp;
}

Я использую метод для добавления растрового изображения в качестве маркера следующим образом:

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.MY_LAYOUT, null);
Bitmap markerBitmap = bitmapFromView(layout, MY_WIDTH, MY_HEIGHT, context);

MarkerOptions markerOptions = new MarkerOptions()
            .title(MY_TITLE)
            .position(MY_POSITION)
            .icon(BitmapDescriptorFactory.fromBitmap(markerBitmap));
map.addMarker(markerOptions);
0 голосов
/ 12 мая 2011

Я пытался сделать что-то похожее - нарисовать на карте воздушные шары в стиле Google Maps с настраиваемыми видами внутри них. Я попытался переопределить draw () для OverlayItem и нарисовать макет, который я определил в XML, таким образом. Проблема заключалась в том, что при переходе View к Drawable для рисования на холсте MapView я потерял все возможности Layout по обработке событий, поэтому такие вещи, как кнопки и т. Д., Не работали должным образом. Если у вас нет каких-либо событий на изображениях, о которых нужно беспокоиться, тогда это может сработать, вам просто нужно накачать свое представление с помощью LayoutInflater текущей активности (activity.getLayoutInflater ()), измерить и разложить его, как описано в разделе Страница «Как Android рисует представления» на сайте разработчиков Android (не удалось опубликовать ссылку из-за ограничений нового пользователя, извините!), И, наконец, вызовите buildDrawingCache () и getDrawingCache () в вашем представлении, чтобы получить его как растровое изображение. Затем его можно нарисовать на холсте, переданном методом draw () созданного вами подкласса Overlay.

Я фактически выбрал второй предложенный вами подход (добавив каждый из них в качестве дочернего представления в MapView, используя MapView.LayoutParams для наведения компоновки над соответствующим OverlayItem), в конце концов. У меня был только один взгляд на ребенка, поэтому я не слишком беспокоился об эффективности здесь, это может быть проблемой для вас, если это действительно то, о чем нужно беспокоиться (хотя, возможно, стоит сначала проверить). Здесь есть небольшая запись того, что я сделал здесь с немного большей детализацией.

Наконец, вы, возможно, захотите взглянуть на подход android-mapviewballoons , который стоит посмотреть.

...