【问题标题】:MyLocationOverlay causes endless redraws我的位置覆盖导致无休止的重绘
【发布时间】:2012-11-26 17:54:22
【问题描述】:

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

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

我的地图活动

@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的项目中复现,问题依旧。
我想从现在开始我会不用那个指南针了

【问题讨论】:

    标签: android android-mapview redraw mylocationoverlay


    【解决方案1】:

    为什么会发生

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

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

    如何解决

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

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

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

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

    问候。

    【讨论】:

    • 您的知识再次非常有用。我会暂时移除指南针,反正我真的不需要它。
    • 您是 StackOverflow 的新手,但是当您认为它正确/完整时,您应该接受一个答案。这会通知其他用户您得到了您需要的答案,他们不需要花时间来处理它。您还可以对您和其他人的帖子中的答案和问题进行投票,以表明您发现它们很有用,以帮助其他人快速找到有用的问题/答案。这是您对社区的贡献的一部分 :-)
    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多