MyLocationOverlay导致无休止的重绘

时间:2012-11-26 17:54:23

标签: android android-mapview redraw mylocationoverlay

我在MapView上遇到异常行为,我使用的是RoboGuice,因为我不确定它是否会影响这个问题。

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

MyMapActivity

@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;
}
}

TestOverlay

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的项目中复制它,问题仍然存在 我想从现在开始我将没有那个指南针

1 个答案:

答案 0 :(得分:1)

为什么会发生

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

使用MapView强制重叠重绘,您必须使用invalidate() mathod请求重绘地图中的每个叠加层,包括未更改的ovarlay。

如何解决

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

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

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

  • 我将传感器更新频率设置为最小频率值。
  • 在更新叠加层之前,我将当前方向与用于绘制罗盘的方向进行比较。如果它们的差异很小(例如3度),我会忽略更新并等待更大的更新,以请求重叠重绘。

问候。