0

我使用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(); 
    } 
} 

回答

0

您是否嘗試過使用,或延長MyLocationOverlay?這可能會更簡單。至少,你可以從它的code得到啓示:

@Override 
    public void onLocationChanged(Location newLocation) { 
      synchronized (this) { 
        location = new GeoPoint((int)(newLocation.getLatitude() * 1000000) , (int)(newLocation.getLongitude()*1000000)); 
        // [...] 
      } 
      mapView.getOverlayController().redrawOverlays(); 
    } 
0

我有完全相同的問題, 經過一番搜索,我做最簡單的事情:

new Timer().scheduleAtFixedRate(tasknew, 500, 1000); 
     TimerTask tasknew = new TimerTask() { 
        @Override 
        public void run() { 
         Refresh(); 
        } 
       }; 

好了,我們需要刷新MapView,但自「mfMapView.invalidate();」正想打電話給另一個線程來編輯UI,我們不能使用這有點兒刷新,所以最簡單的方法來刷新與至少超載低於

 public void Refresh() { 

      mfMapView.getModel().mapViewPosition.setZoomLevelMin((byte) 00); 
     }