我的Android应用程序有两种风格,一种用于Google Play Store,一种用于谷歌地图(v2),另一种用于Amazon App Store,利用了osmdroid
的开源优势。感谢您继续使用该库,我刚刚从更早的版本更新到v5.6.4,很高兴看到已经取得的进展。
我在过去的一年半里一直采用Material设计,最近在设置'spot'(我的应用程序中的主要模型)时转移到了卡片界面。该卡覆盖了手机外形尺寸的一半 - 请参见屏幕截图:
请注意,当信用卡动画覆盖地图的一部分时,来自osmdroid认为是中心的折线顶点与用户的中心之间的差异
请注意,地图中心(地图停止时由白色位置图标表示)不在中心,而是向上移动了卡片和填充的高度。在Google地图(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徽标和我的地图抽象库的副作用)。< / p>
它有点有用,但不是很好。社区有更好的主意吗?我是否遗漏了SDK中负责这些计算的内容?
答案 0 :(得分:0)
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);
}
Snippet 1 :对padding方法的新调整
我不是百分之百关于为什么它现在正在工作,但基本上,我从我的getCenter()
和setCenter(...)
覆盖中分别调用这个方法,它们分别是这样的;
/**
* @see com.brantapps.polaris.api.Mappable#getCenter()
*/
@Override
public GeoPoint getCenter() {
return adjustCentreByPadding(mapView.getMapCenter().getLatitude(), mapView.getMapCenter().getLongitude(), true);
}
Snippet 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()));
}
Snippet 3 :setCenter(...)实现
注意“否定”一词,这是我需要弄清楚的一点。正如我观察到的那样,当由于卡片覆盖(即setCenter(...)覆盖)而将地图“向上”移动时,我将像素添加到高度投影中。当我随后调用getCenter()时,我从高度投影中减去像素。
KindleGeoPointHelper
类是我在Google和OSMDroid上放置的 Polaris 抽象库的工件,可以忽略。