4

Android コンポーネント MyLocationOverlay の GoogleMap API に問題があります。デバイスの場所が変更されるたびに (およびユーザーの場所が表示されている部分またはマップから外れる)、MyLocationOverlay の自動再配置機能 (現在のユーザーの場所へ) をオフにしたいと考えています。

ユーザーの位置が画面の外に出たときに、望ましくないマップの自動中心機能をオフにするフラグがないようです

例えば

public class LocationTest extends MapActivity{

  private MapView map;
  private MapController controller;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    map = (MapView) findViewById(R.id.map);
    final MyLocationOverlayUpdate overlay = new MyLocationOverlayUpdate(this, map);
    overlay.enableMyLocation();
    map.getOverlays().add(overlay);
  }

  @Override
  protected boolean isRouteDisplayed() {
    return false;
  }
}

public class MyLocationOverlayUpdate extends MyLocationOverlay {

  public MyLocationOverlayUpdate(Context context, MapView mapView) {
    super(context, mapView);
  }

  public void drawMyLocation(Canvas canvas, MapView mapView, 
              Location location, GeoPoint geoPoint, long when) {}
}

この問題についてネットを調べましたが、提供されている解決策が見つかりませんでした。

追加情報が見つかりました:

  • ドキュメントに欠陥があるか、バグがあるか、時代遅れになっていると思います:

    必要に応じて、コンストラクターは MapController を取得し、それを使用して、マップが画面外になるときにマップをパンすることにより、「現在地」ドットを表示し続けることができます。

MapController を引数として受け入れるコンストラクターがなく、選択の余地がないように思われるkeeping the "my location" dot visibleためです。

  • super.drawMyLocation() を呼び出さずにメソッド drawMyLocation() をオーバーライドすることで、マップを再センタリングする問題を解決する回避策を偶然見つけました(望ましくない「機能」がオフになります)。ただし、 drawMyLocation() メソッドを再実装する必要があるため、デフォルトの外観を変更します (そして時間を費やします...)

多分もっと明確な解決策がありますか?

4

2 に答える 2

0
public class CustomMyLocationOverlay extends MyLocationOverlay {
 @Override
     protected void drawMyLocation(Canvas canvas, MapView mapView, Location location,
             GeoPoint geoPoint, long when) {
         if (!recenter) {
             mapView.getController().stopAnimation(false);
         }

         // Now draw the location overlay.
         super.drawMyLocation(canvas, mapView, location, geoPoint, when);
     }
}

場所が変わったときのマップの再センタリングは、マップ アニメーションと同じロジックを使用するため、アニメーションを停止することで、マップの再センタリングを停止することができました。お役に立てば幸いです。それは私のために働いた。

于 2013-08-01T18:14:44.407 に答える
0

MyLocationOverlay クラスを拡張し、drawMyLocation メソッドをオーバーライドしてオーバーレイ アニメーションを再実装します。

public class CustomMyLocationOverlay extends MyLocationOverlay {

    private static final String TAG = "Bankomatai";


    private Drawable[] slips;
    private final MapView mapView;
    private int currSlip = 0;
    private Location savedFix = null;
    Point point = new Point();
    Rect rect = new Rect();
    private Handler handler = new Handler();
    private Runnable overlayAnimationTask;


    public CustomMyLocationOverlay(Context context, MapView mapView) {
        super(context, mapView);
        this.mapView = mapView;
        slips = new Drawable[4];
        slips[0] = context.getResources().getDrawable(R.drawable.ic_maps_indicator_current_position_1);
        slips[1] = context.getResources().getDrawable(R.drawable.ic_maps_indicator_current_position_2);
        slips[2] = context.getResources().getDrawable(R.drawable.ic_maps_indicator_current_position_3);
        slips[3] = context.getResources().getDrawable(R.drawable.ic_maps_indicator_current_position_4);
        overlayAnimationTask = new Runnable() {

        @Override
        public void run() {
            currSlip = (currSlip + 1) % slips.length;
            CustomMyLocationOverlay.this.mapView.invalidate();
            handler.removeCallbacks(overlayAnimationTask);
            handler.postDelayed(overlayAnimationTask, 200);

        }

        };
        handler.removeCallbacks(overlayAnimationTask);
        handler.postAtTime(overlayAnimationTask, 100);
    }



    protected void drawMyLocation(Canvas canvas, MapView mapView, Location lastFix, GeoPoint myLocation, long when) {   
        Log.v(TAG, "draw: " + System.currentTimeMillis());      
        mapView.getProjection().toPixels(myLocation, point);
        rect.left = point.x - slips[currSlip].getIntrinsicWidth() / 2;
        rect.top = point.y - slips[currSlip].getIntrinsicHeight() / 2;
        rect.right = point.x + slips[currSlip].getIntrinsicWidth() / 2;
        rect.bottom = point.y + slips[currSlip].getIntrinsicHeight() / 2;
        slips[currSlip].setBounds(rect);
        slips[currSlip].draw(canvas);
    }
}

さらに、4 つのアイコンを作成し、それらを res/drawable フォルダーに ic_maps_indicator_current_position_1、ic_maps_indicator_current_position_2、ic_maps_indicator_current_position_3、ic_maps_indicator_current_position_4 という名前で配置する必要があります。自分で描く必要があります。

于 2012-12-18T16:23:33.647 に答える