use*_*114 7 java android google-maps
我有一个MapView,我在它上面叠加1,700个点,每个点都有相同的可绘制但有不同的信息.我目前正在使用Itemized Overlay添加所有叠加层,然后填充一次.这样可行,但性能很慢.改变缩放级别和焦点是跳跃的.现在,它会更好用,ArrayItemizedOverlay因为它是相同的drawable,或者地图是否同样慢?
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.app.Activity;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;
public class Points extends ItemizedOverlay <OverlayItem> {
Context mContext;
private ArrayList mOverlays = new ArrayList();
String newLine = String.format("%n");
public Points(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
// TODO Auto-generated constructor stub
}
@Override
protected OverlayItem createItem(int i) {
return (OverlayItem) mOverlays.get(i);
}
@Override
public int size() {
return mOverlays.size();
}
@Override
public void draw(Canvas canvas,
MapView mapView,
boolean shadow) {
if (!shadow)
super.draw(canvas, mapView, shadow);
}
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
}
public void populateNow(){
setLastFocusedIndex(-1);
populate();
}
public Points(Drawable defaultMarker, Context context) {
super(boundCenterBottom(defaultMarker));
mContext = context;
}
@Override
protected boolean onTap(int index) {
Intent intent = new Intent();
OverlayItem item = (OverlayItem) mOverlays.get(index);
AlertDialog.Builder dialog1 = new AlertDialog.Builder(mContext);
dialog1.setTitle(item.getTitle());
String info = item.getSnippet();
String delims = "[$]";
String [] tokens = info.split(delims);
String info1 = tokens [0];
String info2 = tokens[1];
String delims2 = "[!]";
String [] tokens2 = info1.split(delims2);
double lat = Double.parseDouble(tokens2[0]);
double lon = Double.parseDouble(tokens2[1]);
final String location = tokens2[0]+","+tokens2[1];
dialog1.setMessage(info2);
dialog1.setPositiveButton("Navigate", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Nav(location);
}
});
dialog1.setNegativeButton("Directions", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Direction(location);
}
}) ;
dialog1.show();
return true;
}
public void Nav(String location) {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("google.navigation:q=" + location));
mContext.startActivity(i);
}
public void Direction(String location) {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?daddr=" + location));
mContext.startActivity(i);
}
}
Run Code Online (Sandbox Code Playgroud)
我如何添加项目:
mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.plug);
itemizedoverlay = new Points(drawable, this);
while (...) {
point = new GeoPoint((int) (lat * 1000000), (int) (lon * 1000000));
overlayitem = new OverlayItem(point, Station_Name, comb);
itemizedoverlay.addOverlay(overlayitem);
}
Run Code Online (Sandbox Code Playgroud)
这不是一个解决方案,而是等待完美解决方案时的一种解决方法。
我遇到了同样的问题并创建了多个叠加层。
6 个 99 点的叠加确实比 1 个 600 点的叠加要快。
(15 秒加载时间 vs 1 秒)
for (int i = 0; i < 99; i++) {
webcamCursor.moveToPosition(i);
float lat = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lat")));
float lon = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lon")));
GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
myOverlay1.addPoint(gp);
}
for (int i = 100; i < 199; i++) {
webcamCursor.moveToPosition(i);
float lat = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lat")));
float lon = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lon")));
GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
myOverlay2.addPoint(gp);
}
for (int i = 200; i < 299; i++) {
webcamCursor.moveToPosition(i);
float lat = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lat")));
float lon = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lon")));
GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
myOverlay3.addPoint(gp);
}
for (int i = 300; i < 399; i++) {
webcamCursor.moveToPosition(i);
float lat = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lat")));
float lon = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lon")));
GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
myOverlay4.addPoint(gp);
}
for (int i = 400; i < 499; i++) {
webcamCursor.moveToPosition(i);
float lat = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lat")));
float lon = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lon")));
GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
myOverlay5.addPoint(gp);
}
for (int i = 500; i < webcamCursor.getCount(); i++) {
webcamCursor.moveToPosition(i);
float lat = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lat")));
float lon = Float.valueOf(webcamCursor.getString(webcamCursor
.getColumnIndex("Lon")));
GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
myOverlay6.addPoint(gp);
}
System.out.println("**TIME**" + (System.currentTimeMillis() - t));
mMap.getOverlays().add(myOverlay1);
mMap.getOverlays().add(myOverlay2);
mMap.getOverlays().add(myOverlay3);
mMap.getOverlays().add(myOverlay4);
mMap.getOverlays().add(myOverlay5);
mMap.getOverlays().add(myOverlay6);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1173 次 |
| 最近记录: |