【发布时间】:2013-03-15 14:14:15
【问题描述】:
我的 UI 有一个 MapFragment,上面覆盖了一个透明的 View。地图占据了整个屏幕,而视图只是屏幕的左三分之一。结果,地图的默认“中心”处于关闭状态。当有人点击标记时,我想将该标记置于 MapFragment 的完全可见区域(而不是 MapFragment 本身的中心)的中心。
因为这很难用文字来形容,所以让我用几张图片。假设我的 UI 是这样的:
当用户点击一个标记时,我想将它居中和放大以更近地看到它。无需任何调整,您将获得以下效果:
我想要的是使标记居中,但在右侧的空间中,如下所示:
如果您不使用地图的投影更改缩放级别,则很容易实现这一壮举:
// Offset the target latitude/longitude by preset x/y ints
LatLng target = new LatLng(latitude, longitude);
Projection projection = getMap().getProjection();
Point screenLocation = projection.toScreenLocation(target);
screenLocation.x += offsetX;
screenLocation.y += offsetY;
LatLng offsetTarget = projection.fromScreenLocation(screenLocation);
// Animate to the calculated lat/lng
getMap().animateCamera(CameraUpdateFactory.newLatLng(offsetTarget));
但是,如果您同时更改缩放级别,则上述计算不起作用(因为 lat/lng 偏移在不同的缩放级别上发生变化)。
让我列出尝试修复的列表:
快速更改缩放级别,进行计算,缩放回原始相机位置,然后制作动画。不幸的是,突然的相机变化(即使只是瞬间)非常明显,我想避免闪烁。
将两个 MapFragment 叠加在一起,一个进行计算,另一个显示。我发现 MapFragment 并不是真正构建为相互叠加的(这条路线存在不可避免的错误)。
通过缩放级别平方的差异来修改屏幕位置的 x/y。理论上这应该可行,但它总是偏离很多(~.1 纬度/经度,这足以偏离)。
即使缩放级别发生变化,有没有办法计算 offsetTarget?
【问题讨论】:
-
“因为 lat/lng 需要在不同的缩放级别进行更改”——这对我来说并没有多大意义。除此之外,我不太确定你为什么要浏览所有屏幕坐标的东西。 “左三分之一”是“左三分之一”,无论您以像素、度、毫米、秒差距还是其他单位测量它。将所有计算都保留在纬度和经度方面会有帮助吗?
-
我认为这很难用语言来解释;让我试着画一张说明问题的图片。
-
那里,同样的问题,但有视觉辅助。使用所有纬度/经度进行计算的问题在于,我想要的偏移量纯粹以像素为单位(基于屏幕大小和 MapFragment 的可见程度)。
-
“我想要的偏移量纯粹以像素为单位”——所以当你写“视图只是屏幕的左三分之一”时,这不是一个准确的说法吗?因为,如果它是准确的,像素是无关紧要的,因为无论测量单位如何,三分之一就是三分之一。
-
占屏幕 1/3 的像素随屏幕大小而变化。所有相机更改都需要一个目标 LatLng,因此我必须能够将所有内容转换为 LatLng。本质上,我正在尝试将屏幕上的像素转换为偏移纬度/经度。该 lat/lng 偏移量会根据缩放级别而变化,因为您放大的越多,您在地图上移动所需的度数变化就越大。