Я работаю над приложением Android, которое уже существует на iPhone.
В приложении есть действие на карте, на котором (я насчитал) около 800 маркеров в четырех группах, помеченных для рисования четырьмя различными цветами.,Каждая группа может быть включена или выключена.Информация о маркерах у меня внутри Списка.Я создаю 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;
}
}