bob*_*tko 6 android map markers
我正在开发一款已经存在于iPhone上的Android应用程序.
在应用程序中,有一个Map活动(我计算过)大约800个标记,分为四组,由四种不同颜色的drawable标记.每组都可以打开或关闭.有关我在List中的标记的信息.我为每个组创建了一个mapOverlay,然后我将该叠加层附加到地图上.我坚信编码部分我做得很好.但无论如何我会附上我的代码......
问题是,我的Nexus One无法处理所有这些标记的地图.绘制500个标记大约需要15秒.然后当全部绘制时,地图不是很平滑.它有点难以缩放和导航.它可以做到,但经验很糟糕,我想看看是否可以在那里做些什么.我知道如果我避免使用String> Double转换,我可以节省一些时间,但我怀疑这会很重要.
iPhone似乎没有显示所有这些标记的问题.显示所有这些大约需要1-2秒,并且缩放和平移也不是那么糟糕.减速是显而易见但仍然可以接受.我个人认为绘制所有这些标记并不好,但app是由其他人设计的,我不应该做出任何重大改变.
我不知道该怎么做.似乎我必须提出不同的功能,如果已知可能使用GPS位置,并且只在某个半径范围内绘制标记,或者,如果位置未知,则使用屏幕中心(地图)并在其周围绘制标记.如果我做出这些改动,我必须对我的老板有合理的解释.
如果有人有任何idas我很感激.
和代码:
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();
Run Code Online (Sandbox Code Playgroud)
................................
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;
}
}
Run Code Online (Sandbox Code Playgroud)
出色地。事实证明,我每次添加标记后都会调用 populate() 。我从 addOverlay() 方法中取出了 populate() ,并在循环完成后调用它。所有标记现在几乎立即显示。现在唯一的问题是地图在较低缩放时反应非常迟钝(一次显示很多标记)。我没有看到这个问题的解决方案,除非我弄清楚如何在地图缩小时减少地图上标记的数量...考虑以某种方式对它们进行分组...目前正在研究这个...
| 归档时间: |
|
| 查看次数: |
5593 次 |
| 最近记录: |