问:如何防止用户在 android 上的 google 地图中留下自定义地图叠加层
Q: How to keep user from leaving custom map overlay in google maps on android
我试图阻止用户离开我在 google 地图上为 android 设备设置的自定义覆盖区域。
问题是我所有试图将用户的视野保持在 GPS 限制范围内的尝试最终都互相争斗并来回弹跳地图。
我所做的是设置一个侦听器和多种方法来在相机超出范围时移动它:
map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
firstMapRegionCheck = true;
VisibleRegion vr = mMap.getProjection().getVisibleRegion();
double left = vr.latLngBounds.southwest.longitude;
double top = vr.latLngBounds.northeast.latitude;
double right = vr.latLngBounds.northeast.longitude;
double bottom = vr.latLngBounds.southwest.latitude;
zoomFix(position);
checkXAxis(position, left, top, right, bottom);
checkYAxis(position, left, top, right, bottom);
}
});
}
我先得到所有的经纬度点。然后我 运行 他们通过一个方法 "zoomFix" 那
public void zoomFix(CameraPosition position){
if (position.zoom < DEFAULT_ZOOM) {
CameraUpdate defaultZoomMove = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
mMap.moveCamera(defaultZoomMove);
}
else if (position.zoom > 17){
CameraUpdate zoomOut = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
mMap.moveCamera(zoomOut);
}
}
最初我同时检查了纬度和经度都太小和太大。我以为这就是他们来回打架的原因。
所以我创建了两种方法,一种检查 x 坐标,一种检查 y 坐标。
我想通过拆分 x 和 y 坐标 - 这可能已经解决了问题。但是没有。
检查 X 轴:
public void checkXAxis(CameraPosition position, double left, double top, double right, double bottom){
if (left < -87.896567) {
LatLng southwest = new LatLng(bottom, -87.896567);
LatLng northeast = new LatLng(top, right);
LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
mMap.moveCamera(camerageUpdate);
zoomFix(position);
}
else if (right > -87.874628)
{
LatLng southwest = new LatLng(bottom, left);
LatLng northeast = new LatLng(top, -87.874628);
LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
mMap.moveCamera(camerageUpdate);
zoomFix(position);
}
}
检查 Y 轴:
public void checkYAxis(CameraPosition position, double left, double top, double right, double bottom){
if (top > 43.178949){
LatLng southwest = new LatLng(bottom, left);
LatLng northeast = new LatLng(43.179501, right);
LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
mMap.moveCamera(camerageUpdate);
zoomFix(position);
if (firstMapRegionCheck){
firstMapRegionCheck = false;
checkXAxis(position, left, top, right, bottom);
}
}
else if (bottom < 43.169292){
LatLng southwest = new LatLng(43.169292, left);
LatLng northeast = new LatLng(top, right);
LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
mMap.moveCamera(camerageUpdate);
zoomFix(position);
if (firstMapRegionCheck){
firstMapRegionCheck = false;
checkXAxis(position, left, top, right, bottom);
}
}
无论如何,如果有人能在再次点击 onCameraChange 侦听器(我认为是问题所在)之前弄清楚如何防止修复相互冲突并且没有完全解决问题,我将不胜感激!
谢谢!
设置侦听器:
mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
VisibleRegion vr = mMap.getProjection().getVisibleRegion();
double left = vr.latLngBounds.southwest.longitude;
double top = vr.latLngBounds.northeast.latitude;
double right = vr.latLngBounds.northeast.longitude;
double bottom = vr.latLngBounds.southwest.latitude;
zoomFix(position);
checkXYAxis(left, top, right, bottom);
}
});
缩放检查方法:
public void zoomFix(CameraPosition position) {
if (position.zoom < DEFAULT_ZOOM) {
CameraUpdate defaultZoomMove = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
mMap.moveCamera(defaultZoomMove);
} else if (position.zoom > 17) {
CameraUpdate zoomOut = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
mMap.moveCamera(zoomOut);
}
}
X 和 Y 坐标范围:
public void checkXYAxis(double left, double top, double right, double bottom) {
//X
if (left < -87.896567) {
left = -87.896567;
}
else if (right > -87.874628) {
right = -87.874628;
}
//Y
if (top > 43.178949) {
top = 43.169292;
}
else if (bottom < 43.169292) {
bottom = 43.169292;
}
//update camera position
LatLng southwest = new LatLng(bottom, left);
LatLng northeast = new LatLng(top, right);
LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
CameraUpdate update = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
mMap.moveCamera(update);
}
我试图阻止用户离开我在 google 地图上为 android 设备设置的自定义覆盖区域。
问题是我所有试图将用户的视野保持在 GPS 限制范围内的尝试最终都互相争斗并来回弹跳地图。
我所做的是设置一个侦听器和多种方法来在相机超出范围时移动它:
map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
firstMapRegionCheck = true;
VisibleRegion vr = mMap.getProjection().getVisibleRegion();
double left = vr.latLngBounds.southwest.longitude;
double top = vr.latLngBounds.northeast.latitude;
double right = vr.latLngBounds.northeast.longitude;
double bottom = vr.latLngBounds.southwest.latitude;
zoomFix(position);
checkXAxis(position, left, top, right, bottom);
checkYAxis(position, left, top, right, bottom);
}
});
}
我先得到所有的经纬度点。然后我 运行 他们通过一个方法 "zoomFix" 那
public void zoomFix(CameraPosition position){
if (position.zoom < DEFAULT_ZOOM) {
CameraUpdate defaultZoomMove = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
mMap.moveCamera(defaultZoomMove);
}
else if (position.zoom > 17){
CameraUpdate zoomOut = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
mMap.moveCamera(zoomOut);
}
}
最初我同时检查了纬度和经度都太小和太大。我以为这就是他们来回打架的原因。
所以我创建了两种方法,一种检查 x 坐标,一种检查 y 坐标。
我想通过拆分 x 和 y 坐标 - 这可能已经解决了问题。但是没有。
检查 X 轴:
public void checkXAxis(CameraPosition position, double left, double top, double right, double bottom){
if (left < -87.896567) {
LatLng southwest = new LatLng(bottom, -87.896567);
LatLng northeast = new LatLng(top, right);
LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
mMap.moveCamera(camerageUpdate);
zoomFix(position);
}
else if (right > -87.874628)
{
LatLng southwest = new LatLng(bottom, left);
LatLng northeast = new LatLng(top, -87.874628);
LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
mMap.moveCamera(camerageUpdate);
zoomFix(position);
}
}
检查 Y 轴:
public void checkYAxis(CameraPosition position, double left, double top, double right, double bottom){
if (top > 43.178949){
LatLng southwest = new LatLng(bottom, left);
LatLng northeast = new LatLng(43.179501, right);
LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
mMap.moveCamera(camerageUpdate);
zoomFix(position);
if (firstMapRegionCheck){
firstMapRegionCheck = false;
checkXAxis(position, left, top, right, bottom);
}
}
else if (bottom < 43.169292){
LatLng southwest = new LatLng(43.169292, left);
LatLng northeast = new LatLng(top, right);
LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
mMap.moveCamera(camerageUpdate);
zoomFix(position);
if (firstMapRegionCheck){
firstMapRegionCheck = false;
checkXAxis(position, left, top, right, bottom);
}
}
无论如何,如果有人能在再次点击 onCameraChange 侦听器(我认为是问题所在)之前弄清楚如何防止修复相互冲突并且没有完全解决问题,我将不胜感激!
谢谢!
设置侦听器:
mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
VisibleRegion vr = mMap.getProjection().getVisibleRegion();
double left = vr.latLngBounds.southwest.longitude;
double top = vr.latLngBounds.northeast.latitude;
double right = vr.latLngBounds.northeast.longitude;
double bottom = vr.latLngBounds.southwest.latitude;
zoomFix(position);
checkXYAxis(left, top, right, bottom);
}
});
缩放检查方法:
public void zoomFix(CameraPosition position) {
if (position.zoom < DEFAULT_ZOOM) {
CameraUpdate defaultZoomMove = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
mMap.moveCamera(defaultZoomMove);
} else if (position.zoom > 17) {
CameraUpdate zoomOut = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
mMap.moveCamera(zoomOut);
}
}
X 和 Y 坐标范围:
public void checkXYAxis(double left, double top, double right, double bottom) {
//X
if (left < -87.896567) {
left = -87.896567;
}
else if (right > -87.874628) {
right = -87.874628;
}
//Y
if (top > 43.178949) {
top = 43.169292;
}
else if (bottom < 43.169292) {
bottom = 43.169292;
}
//update camera position
LatLng southwest = new LatLng(bottom, left);
LatLng northeast = new LatLng(top, right);
LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
CameraUpdate update = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
mMap.moveCamera(update);
}