我试图阻止用户移动到谷歌地图中的某个区域之外。但是,似乎没有一种简单的方法可以做到这一点。第一次问这里是怜悯。
我尝试使用以下功能进行轮询,因为用户滚动,但问题是OnCameraChange不经常启动,因此它的工作速度很快且不准确。我知道必须有一些方法来做到这一点,因为它似乎是一个简单而重要的功能。
private static final LatLng NEBOUND = new LatLng(47.670606, -117.393344);
private static final LatLng SWBOUND = new LatLng(47.661283, -117.411052);
private static final LatLngBounds MAPBOUNDARY = new LatLngBounds(SWBOUND, NEBOUND);
private LatLng lastCenter = new LatLng(47.667454, -117.402309);
private final OnCameraChangeListener mOnCameraChangeListener =
new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
LatLngBounds visibleBounds = guMap.getProjection().getVisibleRegion().latLngBounds;
if(!MAPBOUNDARY.contains(visibleBounds.northeast) || !MAPBOUNDARY.contains(visibleBounds.southwest)){
guMap.moveCamera(CameraUpdateFactory.newLatLng(lastCenter));
}
else
lastCenter = guMap.getCameraPosition().target;
centerLoc.setText(lastCenter.toString());
}
};
答案 0 :(得分:2)
感谢MaciejGórski,我实施了该解决方案 甚至在5毫秒的轮询是相当不稳定的,但它的工作原理 请注意,根据边界的形状和用户屏幕的形状,它们可能无法缩小到足以查看整个区域。
private static final LatLng NEBOUND = new LatLng(47.671781, -117.393352);
private static final LatLng SWBOUND = new LatLng(47.661283, -117.411052);
private static final LatLngBounds MAPBOUNDARY = new LatLngBounds(SWBOUND, NEBOUND);
private LatLng lastCenter = new LatLng(47.667454, -117.402309);
GoogleMap guMap;
private Handler mHandler;
private void checkBoundaries(){
LatLng tempCenter = guMap.getCameraPosition().target;
LatLngBounds visibleBounds = guMap.getProjection().getVisibleRegion().latLngBounds;
if(!MAPBOUNDARY.contains(visibleBounds.northeast) || !MAPBOUNDARY.contains(visibleBounds.southwest)){
guMap.moveCamera(CameraUpdateFactory.newLatLng(lastCenter));
}
else
lastCenter = tempCenter;
}
private void setUpHandler(){
mHandler = new Handler(){
public void handleMessage(Message msg){
checkBoundaries();
sendEmptyMessageDelayed(0, 5);
}
};
}
答案 1 :(得分:0)
您可以尝试使用旧的民意调查技术onCameraChange
,而不是使用map.getCameraPosition()
新的闪亮推送技术。
基本上你需要一个Handler
,它将获得handleMessage
中摄像机位置的值,并且每隔10ms左右就会向此处理程序发送一条消息。在handleMessage
内sendEmptyMessageDelayed
。
您也可以使用Runnable
代替Message
(但这只是品味问题)。