如何更改标记在 Android Map v2 上的位置

Posted

技术标签:

【中文标题】如何更改标记在 Android Map v2 上的位置【英文标题】:How to change the position of a Marker on a Android Map v2 【发布时间】:2013-04-01 02:02:19 【问题描述】:

我需要执行以下操作: 我在地图上有一个标记,我需要更改它的位置。所以我尝试了以下方法:

MarkerOptions a = new MarkerOptions()
            .position(new LatLng(50,6)));
        map.addMarker(a);
        a.position(new LatLng(50,5));

其中地图是GoogleMap。我想我必须刷新地图或其他类似的东西?

【问题讨论】:

【参考方案1】:

找到解决方案,需要这样做:

MarkerOptions a = new MarkerOptions()
    .position(new LatLng(50,6)));
Marker m = map.addMarker(a);
m.setPosition(new LatLng(50,5));

【讨论】:

@dvrm 我检查了它,它改变了地图上标记的位置。更新是什么意思? @dvrm 如果不需要添加标记,则使用 mMap.clear();方法 @mischka 你是对的!它只是添加新标记,而不是更新旧标记。【参考方案2】:

在 google map v2 演示应用中有一个移动标记的示例 .. 在文件 adt-bundle-linux/sdk/extras/google/google_play_services/samples/maps/src/com/exa‌​mple/mapdemo/MarkerDemoActivity.java 中(4.2.2 示例)

这里是移动标记的代码:

public void animateMarker(final Marker marker, final LatLng toPosition, final boolean hideMarker) 
    final Handler handler = new Handler();
    final long start = SystemClock.uptimeMillis();
    Projection proj = mGoogleMapObject.getProjection();
    Point startPoint = proj.toScreenLocation(marker.getPosition());
    final LatLng startLatLng = proj.fromScreenLocation(startPoint);
    final long duration = 500;

    final Interpolator interpolator = new LinearInterpolator();

    handler.post(new Runnable() 
        @Override
        public void run() 
            long elapsed = SystemClock.uptimeMillis() - start;
            float t = interpolator.getInterpolation((float) elapsed
                    / duration);
            double lng = t * toPosition.longitude + (1 - t)
                    * startLatLng.longitude;
            double lat = t * toPosition.latitude + (1 - t)
                    * startLatLng.latitude;
            marker.setPosition(new LatLng(lat, lng));

            if (t < 1.0) 
                // Post again 16ms later.
                handler.postDelayed(this, 16);
             else 
                if (hideMarker) 
                    marker.setVisible(false);
                 else 
                    marker.setVisible(true);
                
            
        
    );

此代码会将标记从一个地理点移动到另一个地理点。

【讨论】:

什么是mGoogleMapObject @HammadNasir,mGoogleMapObject 是 GoogleMap 对象,在您的类中初始化。私人谷歌地图 mGoogleMap;投影项目 = mGoogleMap.getProjection();【参考方案3】:

*** 上的大多数答案都建议使用 remove() 删除标记,然后使用 addMarker 创建一个新标记。而不是这样做,只需将标记保存在 Marker 类型变量中一次,然后更新其位置。

MarkerOptions a = new MarkerOptions().position(new LatLng(50,6))); 
myMarker = mGoogleMap.addMarker(a);

然后不用删除和重新创建标记,只需使用

myMarker.setPosition(newLatLng);  

希望对你有帮助!!

【讨论】:

谢谢!你的评论对我很有用!【参考方案4】:

在函数外部定义“标记”。第一次,它将为 null 并执行“if”条件。第二次将执行“else”。

        Marker marker = null;    
        protected void onPostExecute(Coordinates coordinates) 
        LatLng latLong = new LatLng("lat", "long");
        if (marker == null) 
            MarkerOptions options = new MarkerOptions().position(latLong)
                    .title("Marker Title");
            marker = mMap.addMarker(options);
        
        else 
            marker.setPosition(latLong);
        
     mMap.moveCamera(CameraUpdateFactory.newLatLng(latLong));
     mMap.animateCamera(CameraUpdateFactory.zoomTo(16f));
    

【讨论】:

以上是关于如何更改标记在 Android Map v2 上的位置的主要内容,如果未能解决你的问题,请参考以下文章

Android,如何从 Google Map V2 中删除所有标记?

隐藏信息窗口 android map api v2

如何在 android google map v2 实现上为 geoserver 瓦片重新加载 TileOverlay

在android google map v2中使标记只能点击一次

(Android) 使用地图标记创建边界框并在 Google Map V2 中获取其宽度

根据 Google Maps V2 Android 上的用户方向旋转标记