【问题标题】:MapView adding pushpins on touchMapView 在触摸时添加图钉
【发布时间】:2010-09-12 16:36:14
【问题描述】:

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

我是这样做的:

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 资源)。当点击地图时,我得到了带有坐标的 Toast……剩下要做的就是点击新的,删除旧的图钉并添加一个新的图钉。

但是怎么做呢?

【问题讨论】:

    标签: android android-mapview pushpin


    【解决方案1】:

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

    这里是a sample project,显示使用ItemizedOverlay 拖放图钉。

    【讨论】:

    • 你好,我希望我在搜索该地点时获得一分,但我想做的是,如果我想通过选择该点来更改靠近该地点的地点,我该怎么做你能帮帮我吗
    【解决方案2】:

    这段代码运行良好。

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

    【讨论】:

      【解决方案3】:
      @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 的 GeoPoint...

      【讨论】:

        猜你喜欢
        • 2011-04-26
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-07
        相关资源
        最近更新 更多