Как захватить конец анимации Zoom In / Out из MapController?

Просто интересный запрос здесь, есть способ захвата, когда последовательность анимации зума закончилась при вызове:

MapController.zoomIn() or MapController.zoomOut(); 

Я знаю, что он запускает анимационную последовательность для увеличения / уменьшения масштаба до следующего уровня, однако неизвестно, как я могу найти / google search и т. Д., Чтобы узнать, когда он закончит эту последовательность. Мне нужно иметь возможность запускать команду обновления, когда она остановлена, поэтому моя карта обновляется правильно.

Я обнаружил, что, запустив команду update после вызова указанной выше функции, Projection не с уровня уменьшения, а где-то между ними (поэтому я не могу показать все необходимые мне данные).

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

Как было предложено в другом месте в Stack Overflow, мой зум-прослушиватель является переопределенным MapView.dispatchDraw, который проверяет, изменился ли уровень масштабирования с последнего раза.

Кроме того, я добавил метод isResizing, который проверяет, является ли метка времени более 100 мс, поскольку значение getLongitudeSpan перестало меняться. Прекрасно работает. Вот код:

Мой первый пост переполнения стека! Whoo Hoo!

Открытый класс MapViewWithZoomListener расширяет MapView {

 private int oldZoomLevel = -1; private List<OnClickListener> listeners = new ArrayList<OnClickListener>(); private long resizingLongitudeSpan = getLongitudeSpan(); private long resizingTime = new Date().getTime(); public MapViewWithZoomListener(Context context, String s) { super(context, s); } public MapViewWithZoomListener(Context context, AttributeSet attributeSet) { super(context, attributeSet); } public MapViewWithZoomListener(Context context, AttributeSet attributeSet, int i) { super(context, attributeSet, i); } public boolean isResizing() { // done resizing if 100ms has elapsed without a change in getLongitudeSpan return (new Date().getTime() - resizingTime < 100); } public void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); if (getZoomLevel() != oldZoomLevel) { new AsyncTask() { @Override protected Object doInBackground(Object... objects) { try { if (getLongitudeSpan() != resizingLongitudeSpan) { resizingLongitudeSpan = getLongitudeSpan(); resizingTime = new Date().getTime(); } Thread.sleep(125); //slightly larger than isMoving threshold } catch (InterruptedException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); if (!isResizing() && oldZoomLevel != getZoomLevel()) { oldZoomLevel = getZoomLevel(); invalidate(); for (OnClickListener listener : listeners) { listener.onClick(null); } } } }.execute(); } } public void addZoomListener(OnClickListener listener) { listeners.add(listener); }