当前位置: 首页 > 知识库问答 >
问题:

更改Google地图中的Pin Place

巫马安怡
2023-03-14

我有一个地图,如果用户触摸地图,我将只放置一个pin,我这样做了,但当用户想要更改pin位置时,他应该将pin拖动到新位置

当用户触摸另一个地方时,我想要的是删除之前的引脚并将新引脚放在新的地方而不拖动它。

我该怎么做??

这是我的代码:

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

}

和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();
        }
    }
}

共有1个答案

诸葛苏燕
2023-03-14

此函数可以在onTouch()方法中传递lan和日志

这对我很有用

希望这对你有帮助

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       
}

已编辑:

请参见此示例

 类似资料:
  • 我正在用html/jsp页面主体中的Google地图做一个web动态项目。 我制作了一个函数,可以创建一个标记(lat、lng、map),并在标记的参数中使用一个特殊的image.png作为图标。 在我的地图中,我制作了两种不同的样式(地图的颜色…)“白天”和“夜晚”。 我想知道当用户点击夜间更改样式时,我如何更改标记的图标。事实上,标记的颜色不适合这种风格的地图... 我尝试用相同的名称初始化不

  • 一、本功能说明 生成全站内容的地图索引,以便搜索引擎快速准确的收率网站信息 二、功能详解 1.生成地图 1).如何进入本功能 导航栏 选择扩展 -> 菜单栏 选择 Baibu/Google地图 2).界面解释 点击后显示如下界面 名词解释 Sitemaps: Sitemaps 服务旨在使用 Feed 文件 sitemap.xml 通知 Google、Yahoo! 以及 Microsoft 等 Cr

  • 问题内容: 我正在使用谷歌地图,我需要更改“我的位置”(当前位置按钮)的位置。当前当前位置按钮在右上角。因此,请帮助我如何在Google地图屏幕上重新定位当前位置按钮。提前致谢。 我的示例代码: 问题答案: 你可以用这个

  • 我想更改Google Maps上选定的标记图标,因此我有以下代码: 在这一行,我从下面得到错误: 例外情况如下:

  • 基本上,我有一个方法可以将Image从数据库加载到ImageView中,还有第二个方法可以更改图像,我成功地运行了这两个方法,没有出现异常,但是在change eImage()方法中的setImage之后,我需要更新什么以及如何(场景、阶段)是可能的。我知道在javafx中没有像swings中的repaint()这样的方法,那么我该如何处理呢?