简体   繁体   English

在 Google 地图中更改 Pin 地点

[英]Change Pin Place in Google Maps

i have a map if the user touch the map i will put pin just one pin, i did that but when user want to change the pin place he should drag the pin to the new place我有一个 map 如果用户触摸 map 我将只放置一个引脚,我这样做了但是当用户想要更改引脚位置时他应该将引脚拖动到新位置

What i want when user touch another place i wanna remove the previous pin and put new pin in new place without drag it.当用户触摸另一个地方时我想要什么我想删除以前的引脚并将新引脚放在新位置而不拖动它。

how can i do this??我怎样才能做到这一点??

this is my code:这是我的代码:

      public class AndroidLocationActivity extends MapActivity {


    private MapController mapController;
    private MapView mapView;
    private LocationManager locationManager;
    private MyItemizedOverlay itemizedoverlay;
    private MyLocationOverlay myLocationOverlay;
    GeoPoint p;


    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.point);            
            canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, 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;
        }       }

    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.main); // bind the layout to the activity

        // Configure the Map
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
        mapView.setSatellite(true);
        mapController = mapView.getController();
        mapController.setZoom(14); // Zoon 1 is world view
        mapController.animateTo(p);

        //---Add a location marker---
        MapOverlay mapOverlay = new MapOverlay();
        List<Overlay> listOfOverlays = mapView.getOverlays();
        listOfOverlays.clear();
        listOfOverlays.add(mapOverlay);        

        mapView.invalidate();

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                0, new GeoUpdateHandler());

        myLocationOverlay = new MyLocationOverlay(this, mapView);
        mapView.getOverlays().add(myLocationOverlay);

        myLocationOverlay.runOnFirstFix(new Runnable() {
            public void run() {
                mapView.getController().animateTo(
                        myLocationOverlay.getMyLocation());
            }
        });

        Drawable drawable = this.getResources().getDrawable(R.drawable.point);
        itemizedoverlay = new MyItemizedOverlay(this, drawable);
        createMarker();
    }

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

    public class GeoUpdateHandler implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            int lat = (int) (location.getLatitude() * 1E6);
            int lng = (int) (location.getLongitude() * 1E6);
            GeoPoint point = new GeoPoint(lat, lng);
            createMarker();
            mapController.animateTo(point); // mapController.setCenter(point);

        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

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

    private void createMarker() {
        GeoPoint p = mapView.getMapCenter();
        OverlayItem overlayitem = new OverlayItem(p, "", "");
        itemizedoverlay.addOverlay(overlayitem);
        if (itemizedoverlay.size() > 0) {
            mapView.getOverlays().add(itemizedoverlay);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        myLocationOverlay.enableMyLocation();
        myLocationOverlay.enableCompass();
    }

    @Override
    protected void onPause() {
        super.onResume();
        myLocationOverlay.disableMyLocation();
        myLocationOverlay.disableCompass();
    }

}

and the MyItemizedOverlay和 MyItemizedOverlay

          public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {

    private static int maxNum = 5;
    private OverlayItem overlays[] = new OverlayItem[maxNum];
    private int index = 0;
    private boolean full = false;
    private Context context;
    private OverlayItem previousoverlay;

    public MyItemizedOverlay(Context context, Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
        this.context = context;
    }

    @Override
    protected OverlayItem createItem(int i) {
        return overlays[i];
    }

    @Override
    public int size() {
        if (full) {
            return overlays.length;
        } else {
            return index;
        }

    }

    public void addOverlay(OverlayItem overlay) {
        if (previousoverlay != null) {
            if (index < maxNum) {
                overlays[index] = previousoverlay;
            } else {
                index = 0;
                full = true;
                overlays[index] = previousoverlay;
            }
            index++;
            populate();
        }
        this.previousoverlay = overlay;
    }

    protected boolean onTap(int index) {
        OverlayItem overlayItem = overlays[index];
        Builder builder = new AlertDialog.Builder(context);
        builder.setMessage("This will end the activity");
        builder.setCancelable(true);
        builder.setPositiveButton("I agree", new OkOnClickListener());
        builder.setNegativeButton("No, no", new CancelOnClickListener());
        AlertDialog dialog = builder.create();
        dialog.show();
        return true;
    };

    private final class CancelOnClickListener implements DialogInterface.OnClickListener {
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(context, "You clicked yes", Toast.LENGTH_LONG)
                    .show();
        }
    }

    private final class OkOnClickListener implements DialogInterface.OnClickListener {
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(context, "You clicked no", Toast.LENGTH_LONG).show();
        }
    }
}

this function you can all in onTouch() method pass the lan and log这个 function 你可以全部在 onTouch() 方法中传递 lan 和日志

this works for me fine这对我很好

hope this will help you希望对你有帮助

void addPoint(int lat,int lng)
{

    drawableDot = this.getResources().getDrawable(R.drawable.ipadblue);

    itemizedoverlay= new HelloItemizedOverlay(drawableDot);
    GeoPoint point2 = new GeoPoint((int)(lat * 1E6)+five,(int)(lng * 1E6)+five);
    //GeoPoint point2 = new GeoPoint((int)(lat * 1E6),(int)(lng * 1E6));

    OverlayItem overlayItem2 = new OverlayItem(point2, "111", "222");
    itemizedoverlay.addOverlay(overlayItem2);
    mapOverlays.add(itemizedoverlay);
    mapView.invalidate(); // this is must       
}

edited:编辑:

see this example 看这个例子

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM