如何将地图标记始终保持在屏幕中央? Android的

时间:2016-07-12 19:02:28

标签: java android xml google-maps

我正在尝试找到一种方法来将地图标记置于我的地图片段活动中心。到目前为止,我已经尝试在每次移动地图时向屏幕中心添加标记,即更新相机位置。但是这个解决方案的问题在于,每次将新标记添加到中心的地图中并且旧标记停留在那里,所以在几个拖动中我将在屏幕上看到10个标记。我在添加下一个标记之前尝试使用clear方法,但现在标记只是闪烁太多了。这是我的代码:

mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
            @Override
            public void onCameraChange(CameraPosition cameraPosition) {
                LatLng location=mMap.getCameraPosition().target;
                MarkerOptions marker=new MarkerOptions().position(location).title("");
                mMap.clear();
                mMap.addMarker(marker);
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 16));
            }
        });

我发现的另一个解决方案是使用居中的ImageView,但问题是我想要更改标记的图标。但是当我向图像视图添加image图像时,相机的中心位于此图像中心的绿色小圆圈中,而不是像我想要的那样尖端。请帮忙。

4 个答案:

答案 0 :(得分:2)

不要使用真正的标记。将a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] b = [i <= 5 for i in a] print b [True, True, True, True, True, False, False, False, False, False, False] MapFragment置于布局中,并在其上居中放置假标记图像。选择位置后,放置一个真正的标记并隐藏假标记。

如果假标记图像的“尖端”不在其正中心,只需用透明空间填充图像,直到它为止。

答案 1 :(得分:1)

是的,实际上你可以使用setOnCameraChangeListener。因此,您不需要每次都清除标记,只需为其设置新位置即可。试试这段代码:

map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition cameraPosition) 
    {
        if(marker==null)
        {
            marker = map.addMarker(new MarkerOptions().position(cameraPosition.target).title("Marker")
                    .icon(BitmapDescriptorFactory.fromResource(R.mipmap.marker)));
            marker.showInfoWindow();
        }
        else
        {
            marker.setPosition(cameraPosition.target);
        }
    }
});

这应该有效。因此,唯一的问题是您的标记只会在地图拖动结束时移动到地图的中心。要避免此问题,您可以使用ImageView之类的东西并将其粘贴到地图片段的中心。此后,您可以使用上面的代码添加:

  

marker.setVisible(假);

答案 2 :(得分:0)

假设您使用Google Play服务获取用户的位置 从下面打电话

@Override
    public void onConnected(Bundle connectionHint) {
        Log.i(TAG, "Connected to GoogleApiClient");

        // If the initial location was never previously requested, we use
        // FusedLocationApi.getLastLocation() to get it. If it was previously requested, we store
        // its value in the Bundle and check for it in onCreate(). We
        // do not request it again unless the user specifically requests location updates by
        // pressing
        // the Start Updates button.
        //
        // Because we cache the value of the initial location in the Bundle, it means that if the
        // user launches the activity,
        // moves to a new location, and then changes the device orientation, the original location
        // is displayed as the activity is re-created.
        if (mCurrentLocation == null) {
            mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
            drawOnMap(new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude()));
        }
    }

/**
     * Callback that fires when the location changes.
     */
    @Override
    public void onLocationChanged(Location location) {
        mCurrentLocation = location;
        if (location != null) {
            drawOnMap(new LatLng(location.getLatitude(), location.getLongitude()));
        }
    }

这将是更新地图上标记的功能。

   public void drawOnMap(final LatLng location) {
        if (isFirstLocation) {
            markerCurrent = mMap.addMarker(new MarkerOptions()
                    .position(location)
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.dot)));
            isFirstLocation = false;
        } else {
            markerCurrent.setPosition(location);
        }
        CameraPosition cp = getCameraPosition(location);
        int animationDuration = 600;
        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cp), animationDuration, null);
    }

答案 3 :(得分:0)

首先创建一个标记变量 然后分配标记以添加地图标记

LatLng myMapPosition = new LatLng(19.0760, 72.8777);
marker = mMap.addMarker(new MarkerOptions()
                .position(myMapPosition)
                .draggable(true)              
                .icon(BitmapDescriptorFactory.defaultMarker
                         (BitmapDescriptorFactory.HUE_RED))
                .title("My Location"));


mMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
            @Override
            public void onCameraMove() {
                LatLng midLatLng = mMap.getCameraPosition().target;
                if (marker!=null) marker.setPosition(midLatLng);
                else Log.d("TAG","Marker is null");
            }
        });