Плавное увеличение в просмотре карты - PullRequest
6 голосов
/ 09 декабря 2010

Когда я использую MapController.setZoom (x) и, например, масштабирование от уровня 5 до 15, масштабирование выполняется очень быстро, и часто плитки карты нового уровня не загружаются.

Это не выглядит так хорошо для пользователя. Есть ли в Картах встроенная функция, позволяющая изменить это на более медленное масштабирование, чтобы плитки могли быть загружены или, по крайней мере, почти загружены, до достижения 15-го уровня?

С уважением

P

Ответы [ 2 ]

8 голосов
/ 10 июня 2011

Более простым способом является использование метода MapController.zoomIn (), который обеспечивает некоторую простую анимацию для увеличения уровня шага.

Вот некоторый код:

    // a Quick runnable to zoom in
    int zoomLevel = mapView.getZoomLevel();
    int targetZoomLevel = 18;

    long delay = 0;
    while (zoomLevel++ < targetZoomLevel) {
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mapController.zoomIn();
            }
        }, delay);

        delay += 350; // Change this to whatever is good on the device
    }

Что этоон создает последовательность отложенных исполняемых объектов, каждая из которых будет вызывать zoomIn () через 350 мс после предыдущей.

Предполагается, что к основному потоку пользовательского интерфейса подключен обработчик, называемый «обработчик»

: -)

0 голосов
/ 09 декабря 2010

Нет простого способа сделать это. Тем не менее, я могу вам помочь.

Во-первых, вот бесплатный подарок одного из моих личных служебных классов: Tween.java :

import android.os.Handler;

public class Tween {

    public static interface TweenCallback {
        public void onTick(float time, long duration);
        public void onFinished();
    }

    long start;
    long duration;
    Handler handler;
    TweenCallback callback;

    public Tween(TweenCallback callback) {      
        handler = new Handler();
        this.callback = callback;
    }
    public void start(final int duration) {
        start = android.os.SystemClock.uptimeMillis();
        this.duration = duration;
        tickRunnable.run();
    }
    public void stop() {
        handler.removeCallbacks(tickRunnable);
    }
    Runnable tickRunnable= new Runnable() {
        public void run() {
            long now = android.os.SystemClock.uptimeMillis();
            float time = now - start;
            boolean finished = (time >= duration);
            if (finished) {
                time = duration;
            }
            callback.onTick(time, duration);
            if (!finished) {
                handler.post(tickRunnable);
            }
            else {
                callback.onFinished();
            }
        }
    };

    //
    // Tweening functions. The 4 parameters are :
    //
    //  t - time, ranges from 0 to d
    //  b - begin, i.e. the initial value for the quantity being changed over time
    //  c - change, the amount b will be changed by at the end
    //  d - duration, of the transition, normally in milliseconds. 
    //
    // All were adapted from http://jstween.sourceforge.net/Tween.js 
    //
    public static float strongEaseInOut(float t, float b, float c, float d) {
        t/=d/2; 
        if (t < 1) return c/2*t*t*t*t*t + b;
        return c/2*((t-=2)*t*t*t*t + 2) + b;
    }
    public static float regularEaseIn(float t, float b, float c, float d) {
        return c*(t/=d)*t + b;
    }
    public static float strongEaseIn(float t, float b, float c, float d) {
        return c*(t/=d)*t*t*t*t + b;
    }
}

Что я рекомендую вам сделать, так это использовать MapController.zoomToSpan() в сочетании с Tween ... вот некоторый полностью непроверенный код, который должен работать, возможно, с твиком или двумя, вы просто передаете ему целевые интервалы lat & lon. :

public void slowZoom(int latE6spanTarget, int lonE6spanTarget) {
    final float initialLatE6span = mapView.getLatitudeSpan();
    final float initialLonE6span = mapView.getLongitudeSpan();
    final float latSpanChange = (float)(latE6spanTarget - initialLatE6span);
    final float lonSpanChange = (float)(lonE6spanTarget - initialLonE6span);
    Tween tween = new Tween(new Tween.TweenCallback() {
        public void onTick(float time, long duration) {
            float latSpan = Tween.strongEaseIn(time, initialLatE6span, latSpanChange, duration);
            float lonSpan = Tween.strongEaseIn(time, initialLonE6span, lonSpanChange, duration);
            mapView.getController().zoomToSpan((int)latSpan, (int)lonSpan);
        }
        public void onFinished() {
        }
    });
    tween.start(5000);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...