Mapsforge を使用してオフライン マップを表示しています。ユーザーの GPS 位置をリアルタイムで表示したいと考えています。ドローアブルを表示するマップ上のユーザーの位置を表すオーバーレイ クラスがあります。
デバイスが新しい GPS 位置情報を受信すると、Overlay クラスのメソッドが呼び出されます。メソッドは locationChanged です。このメソッドはオーバーレイの場所を変更し、mapView.invalidate(); を呼び出します。
GoogleMaps では問題なく動作しますが、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();
}
}