我正在尝试找到一种方法来将地图标记置于我的地图片段活动中心。到目前为止,我已经尝试在每次移动地图时向屏幕中心添加标记,即更新相机位置。但是这个解决方案的问题在于,每次将新标记添加到中心的地图中并且旧标记停留在那里,所以在几个拖动中我将在屏幕上看到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图像时,相机的中心位于此图像中心的绿色小圆圈中,而不是像我想要的那样尖端。请帮忙。
答案 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");
}
});