【问题标题】:How to change the position of a Marker on a Android Map v2如何更改标记在 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。我想我必须刷新地图或其他类似的东西?

【问题讨论】:

    标签: android android-maps-v2


    【解决方案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】:

    StackOverflow 上的大多数答案都建议使用 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));
        }
    

    【讨论】:

      猜你喜欢
      • 2013-05-11
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      相关资源
      最近更新 更多