Показывать подсказку / предупреждение при наложении - PullRequest
0 голосов
/ 09 ноября 2011

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

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

Мой код размещен ниже ... Я знаю, что этомного вещей, но любая помощь приветствуется.Большое спасибо!

пакет ca.transcontinental.android.vanilla.demo;

import (...)   

public class GoogleMapActivity extends MapActivity implements LocationListener { 

    MapView mapView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.location_map_layout);   
        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);

        this.mapView = (MapView) findViewById(R.id.mapview);
        this.mapView.setBuiltInZoomControls(true);
        this.mapView.getController().setZoom(10);               
    }

    private BaseApplication getBaseApplication() {
        return (BaseApplication)getApplication();
    }

    public void onLocationChanged(Location location) {
        if (location != null) {   

            String sLat = String.valueOf(location.getLatitude());
            String sLng = String.valueOf(location.getLongitude());

            try {
                getBaseApplication().debug("GPS: lat="+sLat + ", lng="+sLng);                       
                RestQueryEngine.getInstance().setup("http://example.com/JSONPublicationService.svc", "key", getBaseApplication().getOrgCode(), getBaseApplication().getBannerCode());
                StoreList list = StoreList.getStoreListByGeopos(sLat, sLng);                
                for(Store store: list){                 
                    System.out.println(store);  
                    MapOverlay overlay = new MapOverlay(Double.parseDouble(store.getLatitude()), Double.parseDouble(store.getLongitude()), "");
                    mapView.getOverlays().add(overlay);                 
                }
                mapView.invalidate();
            }
            catch (Throwable e) {
                e.printStackTrace();
                getBaseApplication().showExceptionMessage(e);
            }


            LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            lm.removeUpdates(this);

        }

    }


    public void onProviderDisabled(String provider) {
    }

    public void onProviderEnabled(String provider) {
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }   

    class MapOverlay extends Overlay {
        private GeoPoint locpoint;
        private String label;

        public MapOverlay(GeoPoint geoPoint, String name) {
            this.locpoint = geoPoint;
            this.label = name;
        }
        public MapOverlay(double lat, double lon, String name) {
            this(new GeoPoint((int)(lat*1E6), (int)(lon*1E6)), name);           
        }           

        @Override
        public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
            super.draw(canvas, mapView, shadow);
            Point screenPoint = new Point();            
            mapView.getProjection().toPixels(this.locpoint, screenPoint);
            Bitmap markerImage = BitmapFactory.decodeResource(getResources(), R.drawable.androidmarker);
            canvas.drawBitmap(markerImage, screenPoint.x - markerImage.getWidth() / 2, screenPoint.y - markerImage.getHeight() / 2, null);
            return true;
        }       

    }
}

1 Ответ

0 голосов
/ 09 ноября 2011

Я использую OverlayItem вместо Overlay и создаю класс, расширяющий ItemizedOverlay

class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> {

    private ArrayList<MapOverlay> mOverlays = new ArrayList<MapOverlay>();

    public CustomItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
    }

    public void addItem(MapOverlay item) {
        mOverlays.add(item);
    }

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

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

    @Override
    protected boolean onTap(int index) {
        // Handle tap for the given overlay item based on this index
        return super.onTap(index);
    }
}

, который имеет преимущество, которое вы будете использовать R.drawable.androidmarker в качестве маркера по умолчанию и не иметьдля реализации метода draw в оверлее это сделано для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...