1

我遇到了我的异常行为MapView,我正在使用 RoboGuice,但我不确定它是否会影响问题。

问题是,如果我MyLocationListener在我的地图上启用 a,那么它上面的每个叠加层都会无限地不断重绘。
看看这个例子:

我的地图活动

@ContentView(R.layout.map)
public class MyMapActivity extends RoboMapActivity {

@InjectView(R.id.map)
private MapView map;

private List<Overlay> mapOverlays;
private MyLocationOverlay compass;
private TestOverlay testOverlay;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    map.setBuiltInZoomControls(true);
    mapOverlays = map.getOverlays();
    compass = new MyLocationOverlay(this, map);
    testOverlay = new TestOverlay();
}

@Override
protected void onResume() {
    super.onResume();
    compass.enableCompass();
    refreshMap();
}

private void refreshMap() {
    mapOverlays.clear();
    mapOverlays.add(testOverlay);
}

@Override
protected void onPause() {
    compass.disableCompass();
    super.onPause();
}

@Override
protected boolean isRouteDisplayed() {
    return false;
}
}

测试覆盖

public class TestOverlay extends Overlay {

@Override
public void draw(Canvas arg0, MapView arg1, boolean arg2) {
    System.out.println("drawing...");
    super.draw(arg0, arg1, arg2);
}
}

如果我运行它,我将drawing...永远每秒打印大约十次。但是,如果我通过注释掉这一行来
避免启用罗盘:MyLocationOverlay

// compass.enableCompass();

然后重绘停止。
知道为什么会这样吗?这是一个错误还是我做错了什么?

编辑

刚刚在一个没有使用RoboGuice的项目中复现,问题依旧。
我想从现在开始我会不用那个指南针

4

1 回答 1

1

为什么会发生

因为您希望指南针始终指向北方(或其他方向)而与设备旋转无关,因此需要连续读取磁传感器和连续读取指南针。

使用MapView强制覆盖重绘,您必须使用invalidate()请求重绘地图中每个覆盖的方法,包括未更改的 ovarlays。

如何解决

我从未使用过RoboGuice,所以我只能就标准解决方案提供建议。

你不能真正停止重绘,如果你想让指南针指向正确的方向,你也不能只绘制一个叠加层(因为你正在绘制位图,需要清除它并让每个叠加层重绘在上面)。

就我而言,我使用了两个调整来改进这一点:

  • 我将传感器更新频率设置为最小频率值。
  • 在更新覆盖之前,我将当前方向与用于绘制指南针的方向进行比较。如果它们相差很小的度数(例如 3 度),我将忽略更新并等待具有更大差异的更新以请求覆盖重绘。

问候。

于 2012-11-26T20:22:21.117 回答