Плавное масштабирование в mapview

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

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

С наилучшими пожеланиями

п

Более простой способ – использовать метод 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 } 

То, что он делает, это создать последовательность задержанных runnables, каждый из которых вызовет zoomIn () 350ms после предыдущего.

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

🙂

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

Во-первых, вот бесплатный подарок одного из моих личных служебных классов, 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, ie 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 … вот какой-то полностью непроверенный код, который должен работать, может быть, с помощью tweak или two, вы просто передаете ему цели 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); } 
Intereting Posts
Скопируйте файлы в другую папку пакета (root, su) Какой пакет для MultiDexTestRunner? Android.support.multidex или com.android.test.runner MPandroidchart Double YAxis с разной шкалой SQLite – вставка строки с новыми строками в базу данных из файла csv Как использовать обработчик Android для обновления TextView в потоке пользовательского интерфейса? Java.lang.SecurityException: не разрешено запускать сервис. Анимация двухслойных графических элементов Pre-Honeycomb Как установить максимальную дату в диалоговом окне datepicker в android? Как добавить TODO и отслеживать проблемы проекта в Android Studio (НЕ в источниках) Передача заголовков при использовании настроек браузера Расширяемый список android от онлайн-базы данных Совместимость Android Layout Right Align Почему невозможно использовать прописные буквы в ресурсах именования в android? Модификация аудиопотока в Android 4.0 ICS Защита API веб-сервисов Spring RESTful от несанкционированного доступа?