谷歌地图API V2 - 当用户滚动地图时,如何使标记保持在屏幕中心?

22

Google Map API V2 - 用户滚动地图时,如何让标记保持在屏幕中心?

我的目的是让用户选择位置。我使用以下代码添加标记(这是来自Android SDK中的com.example.mapdemo)。

mMap.addMarker(new MarkerOptions()
    .position(new LatLng(0, 0))
    .title("Marker"));

如何使标记保持在屏幕中央并获取其位置?

7个回答

18

我不认为你可以在屏幕中央轻松地浮动标记。我的建议是欺骗用户。像按钮一样将标记图像添加到地图上。您可以使用xml布局将其放置在屏幕中央。然后,当用户选择位置时,只需从屏幕中央检索gps坐标。

另外,你也可以让标记可拖动,这样用户就可以在地图上拖动它。

mMap.addMarker(new MarkerOptions().position(coordinate)
                    .title("Your Title")
                    .snippet("Please move the marker if needed.")
                    .draggable(true)); 

2
当然可以!我有相反的“bug”,想要将它粘到地图上。不要问我怎么做,我也不确定我是怎么处理的... - Flavien Volken
非常好的想法,通过将图像视图置于屏幕中央来跟踪用户,谢谢! - Mohamed Medhat

9
怎么样?
mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
        public void onCameraChange(CameraPosition arg0) {   
                mMap.clear();               
                mMap.addMarker(new MarkerOptions().position(arg0.target));
        }
});

2
+1 它能工作,但是有些抖动。如何使标记移动更加平滑? - Ajay
3
这个方法可以实现,但每次 CameraChangeListener 激活时绘制的开销会导致地图界面出现抖动。这是因为绘制发生在同一个线程上。你需要找到一种方法,在 UI 更改时不需要每次更新就可以绘制或添加标记。 - Oladipo Olasemo

6

选项一

我认为最好的选择是移动标记,当用户移动地图时...

googleMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
            @Override
            public void onCameraMove() {
                marker.setPosition(googleMap.getCameraPosition().target);//to center in map
            }
        });
//note marker is global

选项2

或者简单地说,在您的布局中,使用相对布局将片段放置,并在标记图标上方,您将计算标记始终位于地图的中间...

我认为这很复杂,因为屏幕大小不同,但手机不会每次移动标记...


4

这是解决方案。

    private GoogleMap mMap;
    private Marker markerCenter;

    @Override
    public void onMapReady(GoogleMap googleMap) {

       mMap = googleMap; 

       MarkerOptions markerOptions = new MarkerOptions();
       markerOptions.position(mMap.getCameraPosition().target);
       markerCenter = mMap.addMarker(markerOptions);

       mMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
          public void onCameraMove() {
              markerCenter.setPosition(mMap.getCameraPosition().target);
          }
       });

    }

2
这实际上可以通过在地图上叠加自定义视图来实现。您需要编写一个扩展View的类,并且可以覆盖视图的draw()和onTouchEvent()方法,使其绘制(看起来像)一个标记,置于地图中心的上方。当用户设置标记时,您将使用投影将标记的屏幕位置转换为地图上的LatLong。然后,您可以在地图上设置正确的标记(现在已固定到地理位置)。
从上面可以看出,这不是最简单的过程。建议采用doubleA的解决方案,以便更容易实现。

在新的API发布之前,只需将图像浮动在地图上实际上是很简单的。您只需将其放入包含MapView的XML中即可,它将成为一个子项,在地图滚动时保持静态显示在屏幕上。我一直在尝试使用新的API做同样的事情,但一直无法成功。自定义视图真的是唯一的解决方案吗? - doubleA
是的,如果适合您的目的,您应该能够使用任何现有的小部件(例如imageView)而不是自定义视图。顺便说一下,我已经在v2中处理这些图层的推荐方式上发布了类似的问题 - gsysko
类似这样的代码应该可以在框架布局中工作(确保在地图之后添加覆盖层):

0
Marker marker;//have a instance variable marker
mMap.setOnCameraChangeListener(new OnCameraChangeListener();
public void onCameraChange(CameraPosition cameraPosition) {   
                MarkerOptions options = new MarkerOptions()
                                        .position(cameraPosition.target);

                 if(marker != null){marker.remove();}
                 marker = mMap.addMarker(options);
}

这不会很顺畅,因为在中间帧期间不会调用onCameraChange回调函数。只有在相机完全改变后才会调用。


0
在调用addMarker时获取一个标记引用。之后当相机移动时,将标记移动到相机返回的目标位置。
private Marker marker;

public void onMapReady(final GoogleMap googleMap) {
        LatLng sydney = new LatLng(-34, 151);
        MarkerOptions markerOptions = new MarkerOptions().position(sydney).title("Marker in Sydney");
        marker = googleMap.addMarker(markerOptions);
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
        googleMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
            @Override
            public void onCameraMove() {
                final LatLng target = googleMap.getCameraPosition().target;
                marker.setPosition(target);
            }
        });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接