Я работаю над приложением для Android, которое уже существует на iPhone.
В приложении есть действие «Карта», в котором (я насчитал) около 800 маркеров в четырех группах, отмеченных значком «Возможность рисования» четырьмя разными цветами . Каждую группу можно включить или выключить. Информация о маркерах у меня внутри List. Я создаю mapOverlay для каждой группы, затем прикрепляю это наложение к карте. Я твердо верю, что кодирование я сделал правильно. Но я все равно прикреплю свой код ...
Дело в том, что мой Nexus One может ' • обрабатывать карту со всеми этими маркерами. Чтобы нарисовать 500 маркеров, требуется около 15 секунд. Потом, когда все нарисовано, карта не совсем гладкая. Сложно масштабировать и перемещаться. Это можно сделать, но опыт плохой, и я хотел бы посмотреть, можно ли там что-то сделать. Я знаю, что если я избегу преобразования String> Double, я смогу сэкономить время, но я сомневаюсь, что это будет значительным.
У iPhone, похоже, нет проблем с отображением всех этих маркеров. Чтобы показать их все, требуется примерно 1-2 секунды, а масштабирование и панорамирование - это не так уж и плохо. Замедление заметно, но все же приемлемо. Я лично считаю, что рисовать все эти маркеры бесполезно, но приложение разработано кем-то другим, и я не должен вносить какие-либо радикальные изменения.
Я не уверен, что здесь делать. Вроде придётся придумать другой функционал, возможно, использовать местоположение GPS, если оно известно, и рисовать только маркеры в пределах некоторого радиуса, или, если местоположение неизвестно, использовать центр экрана (карту) и рисовать маркеры вокруг него. У меня должно быть разумное объяснение моим начальникам на случай, если я внесу эти изменения.
Я ценю, если у кого-нибудь есть какие-нибудь иды.
И код:
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.pin_blue);
drawable = this.getResources().getDrawable(R.drawable.pin_blue);
ArrList = appState.GetSleepArrList();
ItemizedOverlay itemizedoverlay = new ItemizedOverlay(drawable, this);
...
...
for (int m = 0; m < ArrList.size(); m++) {
tName = ArrList.get(m).get("name").toString();
tId = ArrList.get(m).get("id").toString();
tLat = ArrList.get(m).get("lat").toString();;
tLng = ArrList.get(m).get("lng").toString();;
try {
lat = Double.parseDouble(tLat);
lng = Double.parseDouble(tLng);
p1 = new GeoPoint(
(int) (lat * 1E6),
(int) (lng * 1E6));
OverlayItem overlayitem = new OverlayItem(p1, tName, tId);
itemizedoverlay.addOverlay(overlayitem);
} catch (NumberFormatException e) {
Log.d(TAG, "NumberFormatException" + e);
}
}
mapOverlays.add(itemizedoverlay);
mapView.postInvalidate();
............ ....................
public class ItemizedOverlay extends ItemizedOverlay<OverlayItem>
{
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
private Context mContext;
public HelloItemizedOverlay(Drawable defaultMarker, Context context)
{
super(boundCenterBottom(defaultMarker));
mContext = context;
}
public void addOverlay(OverlayItem overlay)
{
mOverlays.add(overlay);
populate();
}
@Override
protected OverlayItem createItem(int i)
{
return mOverlays.get(i);
}
@Override
public int size()
{
return mOverlays.size();
}
@Override
protected boolean onTap(int index)
{
final OverlayItem item = mOverlays.get(index);
... EACH MARKER WILL HAVE ONCLICK EVENT THAT WILL PRODUCE CLICABLE
... BALOON WITH MARKER'S NAME.
return true;
}
}