MapView добавляет кнопки при касании

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

Я сделал так:

public class LocationSelectionActivity extends MapActivity 
{    
     GeoPoint p;
     List<Overlay> listOfOverlays;
     MapOverlay mapOverlay;

    private MapView mapView;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.locationselection);

        mapView = (MapView) findViewById(R.id.mapView);
        mapView.setSatellite(false);

        final MapController mc = mapView.getController();
        String coordinates[] = {"46.540606", "22.454542"};

        double lat = Double.parseDouble(coordinates[0]);
        double lng = Double.parseDouble(coordinates[1]);

         p = new GeoPoint(
            (int) (lat * 1E6), 
            (int) (lng * 1E6));

        mc.animateTo(p);
        mc.setZoom(10); 


        ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomcontrols);
        zoomControls.setOnZoomInClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                        mc.zoomIn();
                }
        });
        zoomControls.setOnZoomOutClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                        mc.zoomOut();
                }
        });

      //---Add a location marker---
        mapOverlay = new MapOverlay();
        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.map_flag);            
            canvas.drawBitmap(bmp, screenPts.x, screenPts.y-48, null);

            return true;
        }

        @Override
        public boolean onTouchEvent(MotionEvent event, MapView mapView) 
        {   
            //---when user lifts his finger---
            if (event.getAction() == 1) {                
                GeoPoint p = mapView.getProjection().fromPixels(
                    (int) event.getX(),
                    (int) event.getY());
                    Toast.makeText(getBaseContext(), 
                        p.getLatitudeE6() / 1E6 + "," + 
                        p.getLongitudeE6() /1E6 , 
                        Toast.LENGTH_SHORT).show();

            }                            
            return false;
        }        

    } 

Это рисует начальную канцелярскую кнопку (ресурс map_flag). При нажатии на карту я получаю тост с координатами... все, что осталось сделать, это по новому клику стереть старый пин и добавить новый.

Но как это сделать ?


person Alin    schedule 12.09.2010    source источник


Ответы (3)


Я бы использовал ItemizedOverlay, а не обычный Overlay. Затем все, что вам нужно сделать, это обновить свою коллекцию объектов OverlayItem и вызвать populate() на ItemizedOverlay.

Вот пример проекта, показывающий перетаскивание булавки с помощью ItemizedOverlay.

person CommonsWare    schedule 12.09.2010
comment
привет, я хочу, чтобы я получил один балл, когда я ищу место, но я хочу сделать, если я хочу изменить место, которое находится рядом с этим местом, выбрав эту точку, что я могу сделать, вы можете мне помочь, пожалуйста - person Jay Thakkar; 08.06.2012

Этот код работает нормально.

@Override 
      public boolean onTap(GeoPoint p, MapView mapView) {
            Log.d("tap event ", "tap called");
            mapOverlays = mapView.getOverlays();
            drawable  =getResources().getDrawable(R.drawable.marker);
            itemizedOverlay = new SitesOverlay(drawable);
            int lat=(int)p.getLatitudeE6();
            int lng=(int)p.getLongitudeE6();


            GeoPoint point = new GeoPoint(lat,lng);
            Log.d("tap event ", "tapcalled"+lat+""+lng);
            OverlayItem overlayitem = new OverlayItem(point, "", "");

            items.add(overlayitem);
            populate();
            Log.d("tap event ", "populated");
            //      mapOverlays.add(itemizedOverlay);   


            return true;
        }
person Naveed    schedule 04.01.2012

@Override
public boolean onTouchEvent(MotionEvent event, MapView mapView) 
{   
    //---when user lifts his finger---
    if (event.getAction() == 1) {                
        p = mapView.getProjection().fromPixels(
            (int) event.getX(),
            (int) event.getY());
            Toast.makeText(getBaseContext(), 
                p.getLatitudeE6() / 1E6 + "," + 
                p.getLongitudeE6() /1E6 , 
                Toast.LENGTH_SHORT).show();
    }                            
    return false;
}        

Это сработает. Сделать GeoPoint OnTouchEvent общедоступным...

person N.Droid    schedule 10.11.2010