использование рисованных объектов в виде карты - PullRequest
2 голосов
/ 02 декабря 2011

У меня очень ограниченный опыт работы с Mapview, Overlay и ItemizedOverlay. Я видел несколько простых примеров кода, которые используют один drawable для оверлеев и itemizedOverlays, но я не уверен, как подойти к этим требованиям: я хочу более одного drawable на моем виде карты (пример: значок звезды для центра карты и некоторые другой значок для других элементов наложения), но я хочу, чтобы он был не щелкающим (звездочка). Должен ли я использовать Overlay и ItemizedOverlay для достижения этой цели?

Кроме того, моей следующей проблемой является вопрос представления: если у меня есть 500 элементов для отображения на карте, каков практический способ отображения этой информации? Опять же, у меня мало опыта разработки и использования картографических приложений.

1 Ответ

1 голос
/ 02 декабря 2011

Я столкнулся с такой же ситуацией пару недель назад.

Вы должны использовать один ItemizedOverlay для каждого различного рисованного элемента, а затем добавить overlayItems к ItemizedOverlay.

Наиболее удобный способ - расширить ItemizedOverlay, чтобы вы могли определить маркер и поведение клика для каждого нужного вам стиля.

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

Вот фрагмент моего ItemizedOverlay, который может быть полезен для обоих ваших вопросов:

    private class MarkerItemized_Overlay extends ItemizedOverlay<OverlayItem> {



        private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    Context mContext;

    public MarkerItemizedOverlay(Drawable marker, Context context) {
        super(boundCenterBottom(marker));
        mContext = context;
    }

    public void addOverlay(OverlayItem overlay) {
        if (!mOverlays.contains(overlay)) {
            mOverlays.add(overlay);
            populate();
        }
    }

    @Override
    protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
    }

    @Override
    public int size() {
        return mOverlays.size();
    }

    @Override
    protected boolean onTap(final int index) {
        OverlayItem item = mOverlays.get(index);

        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.setNegativeButton("Annuler",
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton){}
        });
        dialog.setPositiveButton("Naviguer",
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton){ showDirections(mOverlays.get(index).getPoint()); }
        });
        dialog.setInverseBackgroundForced(true);
        dialog.show();
        return true;
    }
    public boolean contains(Store store) {
        return mOverlays.contains(store);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {

        if (e.getAction() == MotionEvent.ACTION_UP) {
            GeoPoint newCenter = mapView.getMapCenter();
            int minLat, maxLat, minLng, maxLng;
            minLat = mapCenter.getLatitudeE6() - mapView.getLatitudeSpan()/2;
            maxLat = mapCenter.getLatitudeE6() + mapView.getLatitudeSpan()/2;
            minLng = mapCenter.getLongitudeE6() - mapView.getLongitudeSpan()/2;
            maxLng = mapCenter.getLongitudeE6() + mapView.getLongitudeSpan()/2;
            if (newCenter.getLatitudeE6() > maxLat ||
                    newCenter.getLatitudeE6() < minLat ||
                    newCenter.getLongitudeE6() > maxLng ||
                    newCenter.getLongitudeE6() < minLng)
            {
                mapCenter = mapView.getMapCenter();
                Location mapCenterLoc = new Location(providerName);
                mapCenterLoc.setLatitude(newCenter.getLatitudeE6()/1E6);
                mapCenterLoc.setLongitude(newCenter.getLongitudeE6()/1E6);
                Store[] newClosestStores = storeDB.getClosestStores(mapCenterLoc);

                for (int i = 0; i < newClosestStores.length; i++) 
                    if (! itemizedOverlay.contains(newClosestStores[i])) 
                        setMarker(newClosestStores[i]);
            }
        }
        return super.onTouchEvent(e, mapView);
    }
}
...