Добавление нескольких маркеров на карте google в android

Я пытаюсь добавить несколько маркеров на карте google. Вот мой раздел кода

public class GoogleMap extends MapView { MapController mc; MapView mapView; GeoPoint p; @Override public void onCreate(Bundle savedInstanceState) { .... double lat = Double.parseDouble(bundle.getString("paramLat")); double lng = Double.parseDouble(bundle.getString("paramLong")); mc = mapView.getController(); p = new GeoPoint( (int) (lat * 1E6), (int) (lng * 1E6)); mc.animateTo(p); mc.setZoom(17); //---Add a location marker--- MapOverlay mapOverlay = new MapOverlay(); List<Overlay> listOfOverlays = mapView.getOverlays(); listOfOverlays.clear(); listOfOverlays.add(mapOverlay); mapView.invalidate(); } class MapOverlay extends com.google.android.maps.Overlay { @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { super.draw(canvas, mapView, shadow); //---translate the GeoPoint to screen pixels--- Point screenPts = new Point(); mapView.getProjection().toPixels(p, screenPts); //---add the marker--- Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pushpin); canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null); return true; } } 

У меня есть два вопроса. Когда я пытался добавить только один маркер, он работает, но метод draw вызывается много раз. Но почему? И когда он вызывается?

Второй вопрос: как добавить новый маркер. Я создал второй geoPoint с именем p2, и после этого что мне делать? Большое спасибо.

Solutions Collecting From Web of "Добавление нескольких маркеров на карте google в android"

Я реализовал несколько маркеров в своем проекте. Вот пример кода; Некоторые вещи, которые вам нужно изменить, – это изображение маркера, длина (количество маркеров, которые вы хотите определить в цикле for). Надеюсь, это поможет !!!

 public class ShowMapActivity extends MapActivity{ private MapController mapControll; private GeoPoint geoPoint=null; private MapView mapview; private MyItemizedOverlay userPicOverlay; private MyItemizedOverlay nearPicOverlay; private Drawable userPic,atmPic; private OverlayItem nearatms[] = new OverlayItem[50]; public static Context context; @Override protected void onCreate(Bundle icicle) { // TODO Auto-generated method stub super.onCreate(icicle); context = getApplicationContext(); setContentView(R.layout.your layout xml); showMap(); } public void showMap() { // TODO Auto-generated method stub try { geoPoint = new GeoPoint((int)(latitude * 1E6),(int)(longitude * 1E6)); mapview = (MapView)findViewById(R.id.mapview); mapControll= mapview.getController(); mapview.setBuiltInZoomControls(true); mapview.setStreetView(true); mapControll.setZoom(16); mapControll.animateTo(geoPoint); userPic = this.getResources().getDrawable(R.drawable.your pic); userPicOverlay = new MyItemizedOverlay(userPic); OverlayItem overlayItem = new OverlayItem(geoPoint, "I'm Here!!!", null); userPicOverlay.addOverlay(overlayItem); mapview.getOverlays().add(userPicOverlay); atmPic = this.getResources().getDrawable(R.drawable.your pic); nearPicOverlay = new MyItemizedOverlay(atmPic); for (int i = 0; i < define your length here; i++) { nearatms[i] = new OverlayItem(new GeoPoint((int)((latitude) * 1E6)),(int)(longitude) * 1E6)),"Name", null);//just check the brackets i just made change here so.... nearPicOverlay.addOverlay(nearatms[i]); } mapview.getOverlays().add(nearPicOverlay); //Added symbols will be displayed when map is redrawn so force redraw now mapview.postInvalidate(); } catch (Exception e) { e.printStackTrace(); } } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } } 

Предметный класс для размещения маркера

 public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> { private ArrayList<OverlayItem> myOverlays ; public MyItemizedOverlay(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); myOverlays = new ArrayList<OverlayItem>(); populate(); } public void addOverlay(OverlayItem overlay){ myOverlays.add(overlay); populate(); } @Override protected OverlayItem createItem(int i) { return myOverlays.get(i); } // Removes overlay item i public void removeItem(int i){ myOverlays.remove(i); populate(); } // Returns present number of items in list @Override public int size() { return myOverlays.size(); } public void addOverlayItem(OverlayItem overlayItem) { myOverlays.add(overlayItem); populate(); } public void addOverlayItem(int lat, int lon, String title) { try { GeoPoint point = new GeoPoint(lat, lon); OverlayItem overlayItem = new OverlayItem(point, title, null); addOverlayItem(overlayItem); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } @Override protected boolean onTap(int index) { // TODO Auto-generated method stub String title = myOverlays.get(index).getTitle(); Toast.makeText(ShowMapActivity.context, title, Toast.LENGTH_LONG).show(); return super.onTap(index); } } 
  1. Для предотвращения множественного рисования вам нужен кеш. Это ошибка в методе рисования MapOverlay
  2. Чтобы добавить несколько маркеров, вы должны использовать ItemizedOverlay. Это может вам помочь.

Вы должны следовать учебному руководству Android Map View на сайте разработчиков.

В части 2 есть раздел для создания Overlay.

http://developer.android.com/resources/tutorials/views/hello-mapview.html

Минимальная работа должна выполняться методом Draw; Он называется много, включая каждый раз, когда карта перемещается / масштабируется / «недействительна»,

Вы захотите начать с ItemizedOverlay, который представляет собой массив точек. Документацию можно найти здесь http://code.google.com/android/add-ons/google-apis/reference/index.html . Затем вам захочется вызвать метод ItemizedOverlay.draw (), который будет рисовать все точки внутри него в зависимости от их положения. Надеюсь это поможет.