OSMdroid:如何最好地实现偏移地图中心
OSMdroid: How best to achieve an offset map centre
我的 Android 应用程序有两种风格,一种用于 Google Play Store, utilising Google Maps (v2) and another for the Amazon App Store,利用开源的优点,即 osmdroid
。感谢您对库的持续努力,我刚刚从更早的版本更新到 v5.6.4,很高兴看到已经取得的进展。
我的问题
我在过去一年半中一直采用 Material 设计,最近在设置 'spot'(我的应用程序中的主要模型)时转移到卡片界面。该卡在 phone 外形尺寸上覆盖了地图的一半 - 请参阅屏幕截图:
移动地图时...
当地图停止时...
请注意来自 osmdroid 认为是中心的折线顶点与卡片动画覆盖地图的一部分时用户认为的中心之间的区别
请注意地图中心(地图停止时用白色位置图标表示)不在中心,而是向上移动了卡片的高度和填充。在 Google Maps (v2) 中,可以使用 setPadding(left, top, right, bottom)
实现此行为。在osmdroid中应该如何实现类似的效果?
我试过的
到目前为止,我已经采用了用类似于代码覆盖 getCenter()
的方法;
/**
* @see com.brantapps.polaris.api.Mappable#getCenter()
*/
@Override
public GeoPoint getCenter() {
// Where is the current centre
final IGeoPoint center = mapView.getMapCenter();
// Calculate the top-left and bottom-right positions
IGeoPoint tl = mapView.getProjection().fromPixels(0, 0);
IGeoPoint br = mapView.getProjection().fromPixels(mapView.getWidth(), mapView.getHeight());
// reset the centre with the px per degree calc.
double newLon = leftPxOffset * (br.getLongitude() - tl.getLongitude()) / mapView.getWidth() + center.getLongitude();
double newLat = bottomPxOffset * (br.getLatitude() - tl.getLatitude()) / mapView.getHeight() + center.getLatitude();
return GeoPointHelper.fromIGeoPointToPolarisGeoPoint(new org.osmdroid.util.GeoPoint(newLat, newLon));
}
...其中 leftPxOffset
和 bottomPxOffset
表示向上移动并稍微向中心右侧移动(稍微向右是 Google 徽标和我的徽标的副作用地图抽象库)。
有点效果,但不是很好。社区有更好的主意吗?我是否在 SDK 中遗漏了一些负责这些计算的东西?
好的,所以我有一个看起来像这样的工作实现;
private GeoPoint adjustCentreByPadding(final double latitude, final double longitude, boolean negate) {
final int newY = negate ? (int) (mapView.getHeight()/2-bottomPxOffset) : (int) (mapView.getHeight()/2+bottomPxOffset);
mapView.getController().setCenter(new org.osmdroid.util.GeoPoint(latitude, longitude));
final IGeoPoint offset = mapView.getProjection().fromPixels(mapView.getWidth()/2, newY);
return KindleGeoPointHelper.fromIGeoPointToRoverGeoPoint(offset);
}
代码段 1:填充方法的新调整
我不是 100% 了解它为什么会像现在这样工作,但本质上,我从我的 getCenter()
和 setCenter(...)
重写中调用了这个方法,它们分别看起来像这样;
/**
* @see com.brantapps.polaris.api.Mappable#getCenter()
*/
@Override
public GeoPoint getCenter() {
return adjustCentreByPadding(mapView.getMapCenter().getLatitude(), mapView.getMapCenter().getLongitude(), true);
}
代码段 2:getCenter() 实现
/**
* @see com.brantapps.polaris.api.Mappable#setCenter(GeoPoint)
*/
@Override
public void setCenter(final GeoPoint geoPoint) {
final GeoPoint adjustedCenter = adjustCentreByPadding(geoPoint.getLatitude(), geoPoint.getLongitude(), false);
mapView.getController().setCenter(new org.osmdroid.util.GeoPoint(adjustedCenter.getLatitude(), adjustedCenter.getLongitude()));
}
代码段 3:setCenter(...) 实现
注意 "negate" 项,这是我需要弄清楚的一点。据我观察,当由于卡片覆盖(即 setCenter(...) 覆盖)而移动地图 "up" 时,我将像素添加到高度投影。当我随后调用 getCenter() 时,我从高度投影中减去像素。
KindleGeoPointHelper
class 是 Polaris 抽象库的产物,我已经放置在 Google 和 OSMDroid 之上,可以忽略。
我的 Android 应用程序有两种风格,一种用于 Google Play Store, utilising Google Maps (v2) and another for the Amazon App Store,利用开源的优点,即 osmdroid
。感谢您对库的持续努力,我刚刚从更早的版本更新到 v5.6.4,很高兴看到已经取得的进展。
我的问题
我在过去一年半中一直采用 Material 设计,最近在设置 'spot'(我的应用程序中的主要模型)时转移到卡片界面。该卡在 phone 外形尺寸上覆盖了地图的一半 - 请参阅屏幕截图:
移动地图时...
当地图停止时...
请注意来自 osmdroid 认为是中心的折线顶点与卡片动画覆盖地图的一部分时用户认为的中心之间的区别
请注意地图中心(地图停止时用白色位置图标表示)不在中心,而是向上移动了卡片的高度和填充。在 Google Maps (v2) 中,可以使用 setPadding(left, top, right, bottom)
实现此行为。在osmdroid中应该如何实现类似的效果?
我试过的
到目前为止,我已经采用了用类似于代码覆盖 getCenter()
的方法;
/**
* @see com.brantapps.polaris.api.Mappable#getCenter()
*/
@Override
public GeoPoint getCenter() {
// Where is the current centre
final IGeoPoint center = mapView.getMapCenter();
// Calculate the top-left and bottom-right positions
IGeoPoint tl = mapView.getProjection().fromPixels(0, 0);
IGeoPoint br = mapView.getProjection().fromPixels(mapView.getWidth(), mapView.getHeight());
// reset the centre with the px per degree calc.
double newLon = leftPxOffset * (br.getLongitude() - tl.getLongitude()) / mapView.getWidth() + center.getLongitude();
double newLat = bottomPxOffset * (br.getLatitude() - tl.getLatitude()) / mapView.getHeight() + center.getLatitude();
return GeoPointHelper.fromIGeoPointToPolarisGeoPoint(new org.osmdroid.util.GeoPoint(newLat, newLon));
}
...其中 leftPxOffset
和 bottomPxOffset
表示向上移动并稍微向中心右侧移动(稍微向右是 Google 徽标和我的徽标的副作用地图抽象库)。
有点效果,但不是很好。社区有更好的主意吗?我是否在 SDK 中遗漏了一些负责这些计算的东西?
好的,所以我有一个看起来像这样的工作实现;
private GeoPoint adjustCentreByPadding(final double latitude, final double longitude, boolean negate) {
final int newY = negate ? (int) (mapView.getHeight()/2-bottomPxOffset) : (int) (mapView.getHeight()/2+bottomPxOffset);
mapView.getController().setCenter(new org.osmdroid.util.GeoPoint(latitude, longitude));
final IGeoPoint offset = mapView.getProjection().fromPixels(mapView.getWidth()/2, newY);
return KindleGeoPointHelper.fromIGeoPointToRoverGeoPoint(offset);
}
代码段 1:填充方法的新调整
我不是 100% 了解它为什么会像现在这样工作,但本质上,我从我的 getCenter()
和 setCenter(...)
重写中调用了这个方法,它们分别看起来像这样;
/**
* @see com.brantapps.polaris.api.Mappable#getCenter()
*/
@Override
public GeoPoint getCenter() {
return adjustCentreByPadding(mapView.getMapCenter().getLatitude(), mapView.getMapCenter().getLongitude(), true);
}
代码段 2:getCenter() 实现
/**
* @see com.brantapps.polaris.api.Mappable#setCenter(GeoPoint)
*/
@Override
public void setCenter(final GeoPoint geoPoint) {
final GeoPoint adjustedCenter = adjustCentreByPadding(geoPoint.getLatitude(), geoPoint.getLongitude(), false);
mapView.getController().setCenter(new org.osmdroid.util.GeoPoint(adjustedCenter.getLatitude(), adjustedCenter.getLongitude()));
}
代码段 3:setCenter(...) 实现
注意 "negate" 项,这是我需要弄清楚的一点。据我观察,当由于卡片覆盖(即 setCenter(...) 覆盖)而移动地图 "up" 时,我将像素添加到高度投影。当我随后调用 getCenter() 时,我从高度投影中减去像素。
KindleGeoPointHelper
class 是 Polaris 抽象库的产物,我已经放置在 Google 和 OSMDroid 之上,可以忽略。