GPS位置发生变化时更新用户覆盖可绘制的问题

时间:2013-04-22 10:19:50

标签: android geolocation overlay android-mapview itemizedoverlay

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

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

它适用于GoogleMaps,但不适用于Mapsforge。使用Mapsforge时,第一次显示用户的GPS位置时可正确显示drawable,但是当设备收到新的GPS位置时,drawable不会移动。仅在用户用手指移动地图时移动。我认为Mapsforge库的invalidate()方法无法正常工作。

正在调用方法locationChanged,因为我使用断点检查了它。正确接收位置,mapView实例正确。

这是我的Overlay课程:

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

2 个答案:

答案 0 :(得分: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();
    }

答案 1 :(得分: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);
        }