2011-07-19 14 views
7

Bir MapView sahibiyim ve her biri aynı çekilebilir ancak farklı bilgilerle 1,700 puan üzerine bindiriyorum. Şu anda tüm bindirmeleri eklemek için Öğe Öğesi Yerleşimi kullanıyorum ve ardından bir kez doldu. Bu çalışır, ancak performans yavaştır. Zum seviyesini değiştirmek ve odaklanmak ürkütücüdür. Şimdi, aynı çekilebilir olduğu için ArrayItemizedOverlay'u kullanmak daha mı iyi olurdu yoksa harita bu kadar yavaş mı? (MapView ve 1700 Bindirme Öğeleri) .equals ("Yavaş")

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); 
    } 
} 

nasıl ekliyorum öğeler:

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); 
} 

cevap

4

Bu çözüm değil, mükemmel bir çözüm için beklerken geçici bir çözüm değildir.

Aynı sorunu yaşadım ve birden çok bindirme oluşturdum.

99 noktadan oluşan 6 bindirme, 600 nokta ile 1 bindirmeden gerçekten daha hızlıdır. Benim durumumda

 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); 
+0

Bunu denedim ve benim için daha hızlı değildi. Eklemek için 108 ürünüm vardı ve bunları üç bölüm halinde ayırdım. Kullandığım yöntemden bağımsız olarak aynı hızdaydı. – dermatthias

+0

Evet, bu yüzden örneğimde 100 öğe kullandım. Hızın düşmeye başladığında sınırın belki 150 ürün olduğunu tahmin ediyorum, bu yüzden endişelenmenize gerek yok. –

0

(15 sn yükleme süresi Vs 1 saniye), ben Overlay#draw() veya MapView#draw() puan Görünür harita alanı düşmek olmadığını kontrol etmek değiştirilecektir. Sıralı başlangıç ​​noktaları dizisiyle kontrol etmek daha iyidir. Fakat ilk kodlama yinelemede yukarıdaki çözümü kullanmayı tercih ediyorum (Profes 162). gerçekten ilginç olabilir

Ayrıca