Как захватить конец анимации Zoom In / Out из MapController? - PullRequest
4 голосов
/ 28 января 2011

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

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

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

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

1 Ответ

1 голос
/ 30 января 2011

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

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

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

Мой самый первый пост переполнения стека!Ууууууу!

открытый класс 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);
}
...