背景
假设我有一个谷歌地图视图,另一个视图,它覆盖了它的一部分,隐藏地图的一些内容.
问题
我需要制作地图的“摄像机”,将焦点放在坐标上,并将其全部置于地图的可见部分的中间.
这样的事情
原始代码着重于(关于)整个屏幕的中心,使标记几乎看不见(如底视图所涵盖).
事实上,我找不到正确的方式来将地图本身的Y坐标(含义为纬度)设置正确的值.
我试过了
考虑到底视图的高度以及我把标记的坐标来计算三角形(当然不会改变标记本身):
final float neededZoom = 6.5f; int bottomViewHeight = bottomView.getHeight(); LatLng posToFocusOn = ...; final Point point = mMap.getProjection().toScreenLocation(posToFocusOn); final float curZoom = mMap.getCameraPosition().zoom; point.y += bottomViewHeight * curZoom / neededZoom; posToFocusOn = mMap.getProjection().fromScreenLocation(point); final CameraUpdate cameraPosition = CameraUpdateFactory.newCameraPosition(new Builder().target(posToFocusOn).zoom(neededZoom).build());
可悲的是,这个重点在标记之上.
问题
我写的是什么问题?我可以做些什么来解决它?
解决方法
好的,我找到了一个解决方法,我认为在所有设备上工作(在3上测试,每个都有不同的屏幕分辨率和大小):
我测量了标记本身有多少像素(然后转换为DP)一度的变化.
从此,我测量了每个视图的高度,并计算了移动相机所需的增量.
在我的情况下,就是这样(假设缩放为6.5f):
//measured as 223 pixels on Nexus 5,which has xxhdpi,so divide by 3 final float oneDegreeInPixels = convertDpToPixels( 223.0f / 3.0f); final float mapViewCenter = mapViewHeight / 2.0f; final float bottomViewHeight = ...; final float posToFocusInPixelsFromTop = (mapViewHeight - bottomViewHeight) / 2.0f ;// can optionally add the height of the view on the top area final float deltaLatDegreesToMove = (mapViewCenter - posToFocusInPixelsFromTop) / oneDegreeInPixels; LatLng posToFocusOn = new LatLng(latitude - deltaLatDegreesToMove,longitude); final CameraUpdate cameraPosition = CameraUpdateFactory.newCameraPosition(new Builder().target(posToFocusOn).zoom(neededZoom).build());
它工作.
我想知道是否可以调整以支持任何变焦的值.