Отключить функцию автоматического получения в компоненте MyLocationOverlay - PullRequest
4 голосов
/ 04 января 2012

У меня проблема с компонентом GoogleMap API для Android MyLocationOverlay. Я хочу отключить функцию автоматического приема 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 или нет.

  • Я случайно нашел обходной путь путем переопределения метода drawMyLocation () без вызова super.drawMyLocation () решает проблему повторного центрирования карты (нежелательная «функция» отключается). Однако я должен переопределить метод drawMyLocation (), поэтому меняю внешний вид по умолчанию (и тратить время ...)

Может есть более понятное решение?

Ответы [ 2 ]

0 голосов
/ 01 августа 2013
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);
     }
}

Центр изменения карты при изменении местоположения использует ту же логику, что и анимация карты, поэтому, остановив анимацию, я смог остановить повторное центрирование карты. Надеюсь, это поможет вам. У меня это сработало.

0 голосов
/ 18 декабря 2012

расширить класс 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 Вы должны нарисовать их самостоятельно.

...