我使用Mapsforge顯示離線地圖,並且想要實時顯示用戶的GPS位置。我有一個Overlay類,它表示地圖上顯示drawable的用戶位置。更新GPS位置變更時繪製的用戶覆蓋問題
當設備收到新的GPS位置時,將調用Overlay類中的方法。該方法是locationChanged。該方法改變Overlay的位置並調用mapView.invalidate();
它可以正常使用GoogleMaps,但不適用於Mapsforge。使用Mapforge時,第一次顯示用戶的GPS位置時,可繪製顯示正確,但是當設備收到新的GPS位置時,繪圖不會移動。只有當用戶用手指移動地圖時纔會移動。我認爲Mapsforge庫的invalidate()方法工作不正常。
方法locationChanged被調用,因爲我用斷點檢查它。該位置正在正確接收,並且mapView的實例是正確的。
這是我的覆蓋類:
public class CapoMyLocationOverlay extends Overlay implements CapoLocationListener{
Bitmap pointer;
GeoPoint location;
int radius;
boolean valid_location;
public MapView mapView;
public CapoMyLocationOverlay(MapView mapView){
Drawable d = ApplicationContextProvider.getContext().getResources().getDrawable(R.drawable.target_location);
pointer = ((BitmapDrawable) d).getBitmap();
radius = pointer.getWidth()/2;
valid_location = false;
this.mapView=mapView;
}
@Override
protected void drawOverlayBitmap(Canvas canvas, Point drawPosition, Projection projection, byte drawZoomLevel) {
if(valid_location){
Point screenPts = new Point();
//GeoPoint location = SectionManager.instance.lastLocationGeoPoint;
mapView.getProjection().toPixels(location , screenPts);
canvas.drawBitmap(pointer, screenPts.x-radius, screenPts.y-radius , null);
}
}
@Override
public void locationChanged(Location newLocation) {
location = new GeoPoint((int)(newLocation.getLatitude() * 1000000) , (int)(newLocation.getLongitude()*1000000));
valid_location = true;
mapView.invalidate();
}
}