Android MapView在触摸屏上添加图钉

Android MapView在触摸屏上添加图钉,android,android-mapview,pushpin,Android,Android Mapview,Pushpin,我设法把地图显示在屏幕上。现在,用户将在地图周围移动并按下它。按下一个点后,我需要在屏幕上的按下位置添加一个图钉。如果用户决定转到另一个点,当按下所选点时,第一个图钉将消失,并在新位置绘制一个新图钉 我喜欢这样: public class LocationSelectionActivity extends MapActivity { GeoPoint p; List<Overlay> listOfOverlays; MapOverlay map

我设法把地图显示在屏幕上。现在,用户将在地图周围移动并按下它。按下一个点后,我需要在屏幕上的按下位置添加一个图钉。如果用户决定转到另一个点,当按下所选点时,第一个图钉将消失,并在新位置绘制一个新图钉

我喜欢这样:

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;
        }        

    } 
公共类LocationSelectionActivity扩展了MapActivity
{    
地质点p;
概述清单;
地图覆盖;
私有地图视图;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.locationselection);
mapView=(mapView)findViewById(R.id.mapView);
mapView.setSatellite(假);
最终的MapController mc=mapView.getController();
字符串坐标[]={“46.540606”,“22.454542”};
double lat=double.parseDouble(坐标[0]);
double lng=double.parseDouble(坐标[1]);
p=新的地质点(
(内部)(纬度*1E6),
(国际)(液化天然气*1E6));
司马迁(p),;
mc.setZoom(10);
ZoomControl ZoomControl=(ZoomControl)findViewById(R.id.ZoomControl);
ZoomControl.setOnZoomInClickListener(新视图.OnClickListener()){
公共void onClick(视图v){
mc.zoomIn();
}
});
ZoomControl.setOnZoomOutClickListener(新视图.OnClickListener()){
公共void onClick(视图v){
mc.zoomOut();
}
});
//---添加位置标记---
mapOverlay=新的mapOverlay();
ListoForLays=mapView.getOverlays();
listOfOverlays.clear();
添加(映射覆盖);
mapView.invalidate();
}
类MapOverlay扩展了com.google.android.maps.Overlay
{
@凌驾
公共布尔绘制(画布、地图视图、地图视图、,
布尔阴影(长时)
{
super.draw(画布、地图视图、阴影);
//---将地质点转换为屏幕像素---
点屏幕PTS=新点();
getProjection().toPixels(p,screenPts);
//---添加标记---
位图bmp=BitmapFactory.decodeResource(getResources(),R.drawable.map_标志);
canvas.drawBitmap(bmp,screenPts.x,screenPts.y-48,null);
返回true;
}
@凌驾
公共布尔onTouchEvent(MotionEvent事件,MapView MapView)
{   
//---当用户抬起手指时---
如果(event.getAction()==1){
地理点p=mapView.getProjection().fromPixels(
(int)event.getX(),
(int)event.getY();
Toast.makeText(getBaseContext(),
p、 getLatitudeE6()/1E6+“,”+
p、 getLongitudeE6()/1E6,
吐司。长度(短)。show();
}                            
返回false;
}        
} 
这将绘制初始图钉(地图标志资源)。当单击地图时,我将与合作者一起获得土司…剩下要做的就是重新单击,删除旧图钉并添加新图钉


但是怎么做呢?

我会使用
ItemizedOverlay
,而不是常规的
Overlay
。然后,您需要做的就是更新
OverlayItem
对象的集合,并在
ItemizedOverlay
上调用
populate()

@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;
}        
此处显示使用
ItemizedOverlay
拖放管脚

@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;
}        

这将起作用。公开OnTouchEvent的地质点…

此代码工作正常

@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;
        }

你好,我想在搜索这个地方时得到一分,但我想做的是,如果我想通过选择那个点来改变靠近那个地方的地方,我该怎么做?你能帮我吗