Android 当GPS位置发生变化时,更新用户覆盖图时出现问题
我正在使用Mapsforge显示脱机地图,并希望实时显示用户GPS位置。我有一个Overlay类,它表示用户在地图上的位置,显示一个可绘制的图形 当设备接收到新的GPS位置时,将调用Overlay类中的方法。方法已更改位置。该方法更改覆盖的位置并调用mapView.invalidate() 它适用于谷歌地图,但不适用于Mapsforge。使用Mapsforge,第一次显示用户的GPS位置时可正确显示可拖动设备,但当设备接收到新的GPS位置时,可拖动设备不会移动。仅在用户用手指移动地图时移动。我认为Mapsforge库的invalidate()方法工作不正常 正在调用方法locationChanged,因为我用断点检查了它。接收到的位置正确,mapView实例正确 这是我的叠加类: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位置时,可拖动设备不会移动。仅在用户用手指移动地图时移动。我认
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);
}