我正在使用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();
}
}
答案 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);
}