Android 当GPS位置发生变化时,更新用户覆盖图时出现问题

Android 当GPS位置发生变化时,更新用户覆盖图时出现问题,android,geolocation,overlay,android-mapview,itemizedoverlay,Android,Geolocation,Overlay,Android Mapview,Itemizedoverlay,我正在使用Mapsforge显示脱机地图,并希望实时显示用户GPS位置。我有一个Overlay类,它表示用户在地图上的位置,显示一个可绘制的图形 当设备接收到新的GPS位置时,将调用Overlay类中的方法。方法已更改位置。该方法更改覆盖的位置并调用mapView.invalidate() 它适用于谷歌地图,但不适用于Mapsforge。使用Mapsforge,第一次显示用户的GPS位置时可正确显示可拖动设备,但当设备接收到新的GPS位置时,可拖动设备不会移动。仅在用户用手指移动地图时移动。我认

我正在使用Mapsforge显示脱机地图,并希望实时显示用户GPS位置。我有一个Overlay类,它表示用户在地图上的位置,显示一个可绘制的图形

当设备接收到新的GPS位置时,将调用Overlay类中的方法。方法已更改位置。该方法更改覆盖的位置并调用mapView.invalidate()

它适用于谷歌地图,但不适用于Mapsforge。使用Mapsforge,第一次显示用户的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();
    }
}

您是否尝试过使用或扩展
MyLocationOverlay
?这可能会更简单。至少,您可以从以下内容中获得灵感:


我也有同样的问题, 经过一些搜索,我做了最简单的事情:

    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);
        }
      public void Refresh() {

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