MapView очень медленный с 1000 оверлейными элементами на карте, даже с только 2 видимыми
У меня есть вид карты, показывающий 1000 оверлейных элементов на виде карты. Карта движется очень медленно, даже если на карте видны только два оверлейных элемента (применено огромное увеличение)
Можно ли оптимизировать вид карты, чтобы он двигался быстрее, если видны только незначительные наложения элементов?
Спасибо
3 ответа
Вы могли упасть в обычную яму. Если вы сделали свой собственный пользовательский оверлей, убедитесь, что ваш метод addOverlay не заполняется. Заполнение должно сначала произойти, когда все наложения были добавлены. Если вы будете заполнять каждый раз, когда будете добавлять, у вас будет много наложений друг на друга.
Убедитесь, что он использует 2 метода для этого процесса, 1 для добавления и 1 для заполнения:
public void addOverlay (оверлей CustomOverlayItem) { mOverlays.add(оверлей); }
public void populateOverlay () {populate (); }
Если это не проблема, вам следует изучить динамическое удаление выводов, когда они находятся за пределами диапазона экрана, или группирование выводов вместе. Я считаю, что есть какой-то проект с открытым исходным кодом, который сделал работу за вас в этом отношении.
Нашел ссылку http://onthefencedevelopment.com/blog/using-google-maps-your-android-applications-%E2%80%93-part-3-adding-place-markers рисуя только наложения, которые находятся на экране, еще не проверял это, но кажется многообещающим.
РЕДАКТИРОВАТЬ: это работает
Подкласс MapView, переопределить dispatchDraw(). Обнаружение изменений в центре карты или уровне масштабирования:
@Override
public void dispatchDraw(Canvas canvas)
{
super.dispatchDraw(canvas);
GeoPoint gpCenterPoint = getMapCenter();
int nZoomLevel = getZoomLevel();
// either diff't zoom level or change to center point?
if ( (gpCenterPoint.getLatitudeE6() != mCenterPoint.getLatitudeE6()) ||
(gpCenterPoint.getLongitudeE6() != mCenterPoint.getLongitudeE6()) ||
(nZoomLevel != mZoomLevel) )
{
// update pins here
updatePINS();
mZoomLevel = nZoomLevel;
mCenterPoint = gpCenterPoint;
}
}
void updatePINS()
{
int nLatitudeSpan = mapView.getLatitudeSpan();
int nLongitudeSpan = mapView.getLatitudeSpan();
// TODO insert/remove PINS as needed
}