【问题标题】:How to remove Marker and redraw it again when changing location on Android map在Android地图上更改位置时如何删除标记并重新绘制
【发布时间】:2012-04-21 10:40:44
【问题描述】:

////编辑前

我正在使用下面的代码在 android 地图上重绘一个标记,实际上它重绘了一个标记,但它并没有删除旧的,我试过了

mapView.invlaidate

但它并没有删除旧的。

这里是 onLocationChanged 函数:

   @Override
 public void onLocationChanged(Location location) {
    // mapView.invalidate();

        //getCurrantPoint();
         OverlayItem currentOverlay = new OverlayItem(getCurrantPoint(),"Current Location","Here is my current location!!!");

            itemizedoverlay2.addOverlay(currentOverlay);
            mapOverlays.add(itemizedoverlay2);
            mapOverlays.remove(currentOverlay);
            Log.v("TAG", "Removeeeeeeeeeeeeeeeed");

         ///
         //mapOverlays.add(itemizedoverlay);
 }

提前致谢。

/////修改后

 if(itemizedoverlay2!=null)
     {
         mapOverlays.remove(itemizedoverlay2);

         itemizedoverlay2 = new HelloItemizedOverlay(drawable2, cntxt);
         OverlayItem currentOverlay = new OverlayItem(getCurrantPoint(),"Current Location","Here is my current location!!!");
         itemizedoverlay2.addOverlay(currentOverlay);

         mapOverlays.add(itemizedoverlay2);
     }
     else
     {
            itemizedoverlay2 = new HelloItemizedOverlay(drawable2, cntxt);

            OverlayItem currentOverlay = new OverlayItem(getCurrantPoint(),"Current Location","Here is my current location!!!");
            itemizedoverlay2.addOverlay(currentOverlay);
            mapOverlays.add(itemizedoverlay2);

     }

非常感谢 imran khan 和 agarwal;我用你的答案来调试问题。

【问题讨论】:

  • 那么你的问题终于解决了吗?
  • 是的,并且出现了另一个问题-我想计算两个位置之间的距离:)

标签: android map location marker


【解决方案1】:

试试这个:

OverlayItem currentOverlay = new OverlayItem(getCurrantPoint(),"Current Location","Here is my current location!!!");
itemizedoverlay2.addOverlayItem(currentOverlay);
mapOverlays.getOverlays().add(itemizedoverlay2);
mapOverlays.getOverlays().remove(itemizedoverlay2);
mapOverlays.invalidate();
Log.v("TAG", "Removeeeeeeeeeeeeeeeed");

//mapOverlays 是您的 mapView 对象, itemizedoverlay2 是您的 LocationOverlay

删除 LocationOverlay 即 itemizedoverlay2 而不是 OverlayItem

【讨论】:

  • 我试过这个,但也没有任何改变......实际上我有一个解决方案,也许它可以在另一个地方工作,你会在上面的问题中检查它吗?
【解决方案2】:

试试这个:::

@覆盖 公共无效onLocationChanged(位置位置){ // mapView.invalidate();

    //getCurrantPoint();
     OverlayItem currentOverlay = new OverlayItem(getCurrantPoint(),"Current Location","Here is my current location!!!");
        itemizedoverlay2.clear();
        itemizedoverlay2.addOverlay(currentOverlay);
       //in above line create new itemizedoverlay2 every time.
        mapOverlays.clear();
        mapOverlays.add(itemizedoverlay2);            

     ///
     //mapOverlays.add(itemizedoverlay);

}

更新了看看:::

典型的自定义叠加层如下所示。它将地图上显示的各种 OverlayItem 封装在一个列表中。

public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem>{

    private List<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

    public MyItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));        
    }

    @Override
    protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
    }

    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }

    public void removeOverlay(OverlayItem overlay) {
        mOverlays.remove(overlay);
        populate();
    }


    public void clear() {
        mOverlays.clear();
        populate();
    }

    @Override
    public int size() {
        return mOverlays.size();
    }
}

方法可以公开添加/删除单个覆盖项,也可以删除所有覆盖项(清除方法)。

删除单个覆盖项

MyItemizedOverlay sitesOverlay =  (MyItemizedOverlay ) map.getOverlays().get(0);
sitesOverlay.removeOverlay(overlay);

添加单个叠加项

MyItemizedOverlay sitesOverlay =  (MyItemizedOverlay ) map.getOverlays().get(0);
sitesOverlay.addOverlay(new OverlayItem(p, "title", "snippet"));

移除所有覆盖项

MyItemizedOverlay sitesOverlay =  (MyItemizedOverlay ) map.getOverlays().get(0);
sitesOverlay.clear();

【讨论】:

  • 可能您的位置两次都相同,或者创建 itemizedoverlay2 的新实例
  • 位置改变了;它绘制了新位置,但也保留了旧位置。
  • 这只是我告诉你为 itemizedoverlay2 创建新实例或在添加其他实例之前从中删除覆盖
  • 您每次都在添加 itemizedoverlay2.addOverlay(currentOverlay);但在添加调用 itemizedoverlay2.clear():
  • 我使用了你的逻辑,但我的初学者方式就像上面一样......我更新了问题。谢谢。
【解决方案3】:

为什么要重新发明自己的距离计算器,Location 类中内置了一个。

退房

distanceBetween(double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results) 

计算两个位置之间的近似距离(以米为单位),以及它们之间最短路径的初始方位和最终方位。

【讨论】:

  • 你有示例如何正确使用它,因为我尝试了 distanceTo 和 distanceBetween 但它返回未知数据(给我)
猜你喜欢
  • 2012-07-29
  • 2019-08-16
  • 1970-01-01
  • 2017-07-24
  • 2022-01-03
  • 2018-06-06
  • 2014-09-19
  • 1970-01-01
  • 2018-03-13
相关资源
最近更新 更多