我正在使用Mapbox Android SDK和一些自定义离线地图。我从iOS有很长的经验,但我是Android的初学者。
我只想在地图上显示一些标记。由于我遇到了Mapbox Marker类的问题,我试图通过附加到位于地图顶部的不可见RelativeLayout的自定义视图来实现标记(代码中为myMarkerOverlay
)。然后我的目的是通过在用户滚动/缩放/旋转地图时操纵他们的leftMargin
和topMargin
来移动这些标记。
更新标记位置的代码由MapListener
方法onScroll
,onZoom
和onRotate
触发。
这些是问题:
repositionAllMarkers
(通过调试验证),
但标记永远不会在屏幕上移动。这是Mapbox特有的问题还是我错过了关于如何在Android上完成动画的重要事项?
(从代码中可以看出,我试图添加theMarker.invalidate()
但没有成功。)
代码:
private void repositionAllMarkers() {
// Get the current (variable) projection
Projection proj = mapView.getProjection();
// Calculate a deltaX and deltaY based on the marker icon size and anchor position
// The screencoordinates will then be adjusted by these amounts when setting the left and
// top margins of the markers
float deltaXdp = - MARKER_ANCHOR_X * MARKER_WIDTH;
float deltaYdp = - MARKER_ANCHOR_Y * MARKER_HEIGHT;
// Convert from dp to pixels
DisplayMetrics dm = getActivity().getResources().getDisplayMetrics();
int deltaX = Math.round(deltaXdp * dm.density);
int deltaY = Math.round(deltaYdp * dm.density);
// Loop through all markers
PointF screenPoint = null;
for(int i = 0; i < myMarkerOverlay.getChildCount(); i++) {
MyMarker theMarker = (MyMarker) myMarkerOverlay.getChildAt(i);
screenPoint = proj.toPixels(theMarker, screenPoint);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) theMarker.getLayoutParams();
lp.leftMargin = Math.round(screenPoint.x) + deltaX;
lp.topMargin = Math.round(screenPoint.y) + deltaY;
// Try forcing a redraw of the marker
theMarker.invalidate();
}
}
// MapListener methods
@Override
public void onScroll(ScrollEvent event) {
repositionAllMarkers();
}
@Override
public void onZoom(ZoomEvent event) {
repositionAllMarkers();
}
@Override
public void onRotate(RotateEvent event) {
repositionAllMarkers();
}
MyMarker
扩展RelativeLayout
并实现Mapbox接口ILatLng
(即它存储自己的位置,可由getLatitude
和getLongitude
读取)。所有MyMarker
个实例都已添加到myMarkerOverlay
。