20

Google Map API V2 - 如何在用户滚动地图时将标记保留在屏幕中央?

我的目的是让用户选择一个位置。我使用以下代码添加标记(它来自com.example.mapdemoAndroid SDK)

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

如何将标记保持在屏幕中央,然后检索它的位置?

4

7 回答 7

16

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

在旁注中,您也可以让您的标记可拖动然后用户可以在地图上拖动它。

mMap.addMarker(new MarkerOptions().position(coordinate)
                    .title("Your Title")
                    .snippet("Please move the marker if needed.")
                    .draggable(true)); 
于 2013-01-04T07:34:15.790 回答
9

怎么样?

mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
        public void onCameraChange(CameraPosition arg0) {   
                mMap.clear();               
                mMap.addMarker(new MarkerOptions().position(arg0.target));
        }
});
于 2013-01-08T16:10:41.813 回答
6

选项1

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

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

选项 2

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

我认为这很复杂,按屏幕大小计算,但每次标记时手机都不会移动......

于 2016-12-14T23:52:16.617 回答
2

这实际上可以通过在地图顶部覆盖自定义视图来实现。您将编写一个扩展 View 的类,并且您可以覆盖视图的 draw() 和 onTouchEvent() 方法,这样它就会在地图中间的顶部绘制(看起来像)一个标记。当用户设置标记时,您将使用投影将标记的屏幕位置转换为地图上的 LatLong。然后,您可以在地图上设置适当的标记(现在将固定到地理位置)。

从上面可以看出,这不是最简单的过程。为了便于实施,我建议使用 doubleA 的解决方案。

于 2013-01-06T21:40:40.600 回答
2

这是解决方案

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

    }
于 2019-07-04T20:43:20.243 回答
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 回调。只有在相机完全更改后才会调用它。

于 2015-06-08T19:25:29.663 回答
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);
            }
        });
}
于 2017-02-10T14:17:23.113 回答