Отключить функцию автоматического получения в компоненте MyLocationOverlay
У меня проблема с компонентом 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 ответа
Расширить класс 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. Вы должны нарисовать их самостоятельно.
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);
}
}
Центрирование карты при изменении местоположения использует ту же логику, что и анимация карты, поэтому, остановив анимацию, я смог остановить повторное центрирование карты. Надеюсь, это поможет вам. Это сработало для меня.