4

Google マップで MyLocationOverlay のデフォルトの青いアニメーション マーカーを変更するにはどうすればよいですか?

4

2 に答える 2

9

Thx @CommonsWare、あなたは私を正しい方向に導いてくれました。これをいじるのにかなりの時間を費やしました。http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MyLocationOverlay.htmlの Javadocは単に間違っている (または時代遅れである) ため、脳のどこかを混乱させます。言います:

drawMyLocation

また、ユーザーの位置が画面の端近くに移動し、コンストラクターで MapController が与えられている場合、スクロールして新しい読み取り値を中央に戻します。

これは完全に間違っています。まず、クラスにそのようなコンストラクターがありません。次に、drawMyLocation は、現在の Location がビュー境界内にある場合、または画面が移動した場合にのみ呼び出されます。したがって、新しい場所を受け取り、現時点でマーカーが表示されていない場合、マーカーは再描画されません。これは一般的には良いことですが、場所を中央に保つためにメソッドに mc.animateTo を実装したい場合は悪いことです。

第三に、すでに mapView があり、そこからコントローラーを取得しているため、currentLocation を有効にするために MapController を渡す必要はありません。

そのため、位置が mapView の境界に到達するか画面外になると、現在の位置を中心に維持する独自のクラスを作成することになりました。

public class CurrentLocationOverlay extends MyLocationOverlay {

  // TODO: use dynamic calculation?
  private final static int PADDING_ACTIVE_ZOOM     = 50;

  private MapController    mc;
  private Bitmap           marker;
  private Point            currentPoint            = new Point();

  private boolean          centerOnCurrentLocation = true;

  private int              height;
  private int              width;

  /**
   * By default this CurrentLocationOverlay will center on the current location, if the currentLocation is near the
   * edge, or off the screen. To dynamically enable/disable this, use {@link #setCenterOnCurrentLocation(boolean)}.
   *
   * @param context
   * @param mapView
   */
  public CurrentLocationOverlay(Context context, MapView mapView) {
    super(context, mapView);
    this.mc = mapView.getController();
    this.marker = BitmapFactory.decodeResource(context.getResources(), R.drawable.position);
  }

  @Override
  protected void drawMyLocation(Canvas canvas, MapView mapView, Location lastFix, GeoPoint myLocation, long when) {
    // TODO: find a better way to get height/width once the mapView is layed out correctly
    if (this.height == 0) {
      this.height = mapView.getHeight();
      this.width = mapView.getWidth();
    }
    mapView.getProjection().toPixels(myLocation, currentPoint);
    canvas.drawBitmap(marker, currentPoint.x, currentPoint.y - 40, null);
  }

  @Override
  public synchronized void onLocationChanged(Location location) {
    super.onLocationChanged(location);
    // only move to new position if enabled and we are in an border-area
    if (mc != null && centerOnCurrentLocation && inZoomActiveArea(currentPoint)) {
      mc.animateTo(getMyLocation());
    }
  }

  private boolean inZoomActiveArea(Point currentPoint) {
    if ((currentPoint.x > PADDING_ACTIVE_ZOOM && currentPoint.x < width - PADDING_ACTIVE_ZOOM)
        && (currentPoint.y > PADDING_ACTIVE_ZOOM && currentPoint.y < height - PADDING_ACTIVE_ZOOM)) {
      return false;
    }
    return true;
  }

  public void setCenterOnCurrentLocation(boolean centerOnCurrentLocation) {
    this.centerOnCurrentLocation = centerOnCurrentLocation;
  }
}
于 2011-03-06T14:46:07.303 に答える
5

ステップ #1: のサブクラスを作成しますMyLocationOverlay

ステップ #2:drawMyLocation()マーカーを上書きして好きなように描画します。このメソッドはマーカーを描画するだけでなく、「ユーザーの位置が画面の端近くに移動MapControllerし、コンストラクターで が与えられた場合、スクロールして新しい読み取り値を中心に戻す」ことに注意してください。

于 2010-11-14T00:13:39.090 に答える