使用Mapbox Android SDK

时间:2015-07-21 08:16:31

标签: android mapbox

我正在使用Mapbox Android SDK和一些自定义离线地图。我从iOS有很长的经验,但我是Android的初学者。

我只想在地图上显示一些标记。由于我遇到了Mapbox Marker类的问题,我试图通过附加到位于地图顶部的不可见RelativeLayout的自定义视图来实现标记(代码中为myMarkerOverlay)。然后我的目的是通过在用户滚动/缩放/旋转地图时操纵他们的leftMargintopMargin来移动这些标记。

更新标记位置的代码由MapListener方法onScrollonZoomonRotate触发。

这些是问题:

  • onScroll触发repositionAllMarkers(通过调试验证), 但标记永远不会在屏幕上移动。
  • onZoom和onRotate正在运行,但仅在手势有效时才有效 结束(即用户将手指从屏幕上抬起)。我想要 在手势期间连续更新标记位置!

这是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(即它存储自己的位置,可由getLatitudegetLongitude读取)。所有MyMarker个实例都已添加到myMarkerOverlay

0 个答案:

没有答案