Frage

Ich möchte folgendes tun und bin ein bisschen stuck auf diese für ein paar Tage:

  1. Ich habe versucht, auf zeichnen Polylinien (ich habe Polylinien codiert, aber haben es geschafft, diejenigen zu entschlüsseln) , die sich bewegen, wenn ich die Karte bewegen .
    Die einzige Lösung, die ich fand, war für Geopoints in Bildschirmkoordinaten umgewandelt zu werden ... was, wenn ich die Karte bewegen wird sich nicht bewegen.

  2. ich HelloItemizedOverlay zum Hinzufügen zu 150 Marker und es wird sehr, sehr langsam .
    Jede Idee, was zu tun? Ich dachte an Fäden (Handler).

  3. Ich war auf der Suche nach einer Art einer Timer-Funktion, die in regelmäßigen Abständen eine bestimmte Funktion ausführt, , sagen wir, alle 1 Minute oder so.

  4. Ich war auch auf der Suche nach Möglichkeiten, um deaktivieren Sie die Google-Karte von allen Markierungen / Linien , etc.

War es hilfreich?

Lösung

Antworten gegeben unter:

1) Hier ist eine Lösung, die ich verwenden:

/** Called when the activity is first created. */
private List<Overlay> mapOverlays;

private Projection projection;  

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    linearLayout = (LinearLayout) findViewById(R.id.zoomview);
    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);

    mapOverlays = mapView.getOverlays();        
    projection = mapView.getProjection();
    mapOverlays.add(new MyOverlay());        

}

@Override
protected boolean isRouteDisplayed() {
    return false;
}

class MyOverlay extends Overlay{

    public MyOverlay(){

    }   

    public void draw(Canvas canvas, MapView mapv, boolean shadow){
        super.draw(canvas, mapv, shadow);

    Paint   mPaint = new Paint();
        mPaint.setDither(true);
        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(2);

        GeoPoint gP1 = new GeoPoint(19240000,-99120000);
        GeoPoint gP2 = new GeoPoint(37423157, -122085008);

        Point p1 = new Point();
        Point p2 = new Point();

    Path    path = new Path();

    Projection  projection.toPixels(gP1, p1);
        projection.toPixels(gP2, p2);

        path.moveTo(p2.x, p2.y);
        path.lineTo(p1.x,p1.y);

        canvas.drawPath(path, mPaint);
    }

Mit freundlicher Genehmigung: Zeichnen einer Linie / Weg auf Google Maps

2) Hier ist, was für mich gearbeitet:

createMarkers()
{ 
    for(elem:bigList)
    { 
        GeoPoint geoPoint = new GeoPoint((int)(elem.getLat()*1000000), (int) (elem.getLon()*1000000)); 
        OverlayItem overlayItem = new OverlayItem(geoPoint, elem.getName(), elem.getData()); 
        itemizedOverlay.addOverlay(overlayItem); 
    } 

    itemizedOverlay.populateNow(); 
    mapOverlays.add(itemizedOverlay); //outside of for loop 
} 

und in MyOverlay:

public void addOverlay(OverlayItem overlay) 
{ 
    m_overlays.add(overlay); 
} 

public void populateNow()
{
    populate(); 
}

Mit freundlicher Genehmigung: stackoverflow.com unbekannt Link

3) Der beste Weg ist es, eine Timer-Klasse zu verwenden. Eine sehr detaillierte Beschreibung der Timer-Klasse und wie es unter diesem Link gegeben verwenden:

http://life.csu.edu.au /java-tut/essential/threads/timer.html

4) ich diesen Code verwendet:

if(!mapOverlays.isEmpty()) 
{ 
    mapOverlays.clear(); 
    mapView.invalidate(); 
} 

Hope diese Antworten Hilfe atleast eine weitere Person. Danke.

Andere Tipps

Ich habe das gleiche Problem. Wir entwickeln ein iPhone-App und eine Android-App zur gleichen Zeit. Ich habe 2500 + Karten-Overlays. Kein Problem auf iphone; eine große Leistung Hit auf Android, wenn nach dem Hinzufügen aller Overlays bevöl () aufgerufen wird. (Natürlich war mein erster Versuch bevöl () aufzurufen, jedes Mal, nachdem eine Overlay-Zugabe, ein typischer Fehler aufgrund der Google-Tutorial Jetzt nenne ich bevölkert () nur einmal, nachdem alle 2500+ Overlays zum ItemizedOverlay hinzugefügt wurden.. )

So ist der einzige bevöl () Aufruf von mehr als 40 Sekunden dauert, auf einem htc Helden Gerät abzuschließen. Ich hatte in einem Besetztanzeige zu setzen; kein Fortschrittsbalken ist möglich, weil wir keine Informationen über den Fortschritt der populate () erhalten können.

habe ich versucht, eine andere Lösung: ItemizedOverlay nicht verwenden, aber Overlays von Hand hinzufügen, Subklassen Overlay. Ergebnis: In der Tat ist es viel schneller alle jene Overlays der Karte hinzuzufügen; jedoch wird die Karte unbrauchbar aufgrund der ständigen Aufruf der Methode draw () auf jeder Überlagerung. In meinem Draw-Verfahren, habe ich versucht, so viel wie möglich zu optimieren; Ich habe nicht eine Bitmap jedes Mal erstellen. Meine Methode draw () sieht wie folgt aus:

public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow)  {
// our marker bitmap already includes shadow.
// centerPoint is the geopoint where we need to put the marker.
 if (!shadow) {
  Point point = new Point();  
  mapView.getProjection().toPixels(centerPoint, point);
  canvas.drawBitmap(markerBitmap, point.x, point.y, null);
 }

}

Hier markerBitmap ist vorberechnet. Ich weiß nicht, was sonst könnte ich optimieren. Gibt es irgendeine Art von populate () erforderlich nennen, wenn wir verwenden ItemizedOverlay nicht ??? Ich konnte keine gute Antworten für das finden.

Im Moment greife ich die ItemizedOverlay zu Cachen, sobald es in einem Hintergrund-Thread erstellt wurde. Auf diese Weise zumindest der Benutzer muss nicht jedes Mal warten.

# 2, ich glaube nicht gelöst Sie alles da. Ihr schwer zu lesende Code zeigt, wie Markierungen auf Overlay setzen und dann, wie man das Overlay zur Karte hinzuzufügen. Das ist genau, wie ich es tun. Ich habe mit rund 300 Hotels Karte und es dauert ca. 5 Sekunden für Android auf meinem Nexus One Marker zu erstellen. Das Ganze ist im Inneren Faden und ich denke, ich werde eine Art von Fortschrittsbalken zu tun haben Benutzer wissen zu lassen, was los ist.

Ich arbeite an app, die auf dem iPhone ist bereits vorhanden und es scheint, iPhone hat keine Probleme fast augenblicklich diesen 300+ Marker zu zeichnen. Ich werde harte Zeit zu Existenz von Fortschrittsbalken zu meinen Chefs zu erklären.

Wenn jemand Ahnung, wie um diesen Prozess zu optimieren ... werde ich dankbar sein.

Hier ist mein Code:

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

Ich weiß, dass ich durch die Vermeidung von dieser String> Doppel Umwandlung etwas Zeit sparen könnte, aber ich fühle mich nicht, dass würde ich erhebliche Einsparung .. oder es würde?

Für Ihre vierte Frage .... verwenden Sie einfach den mapOverlays.clear (); Verfahren und alle vorherigen Marker werden verschwunden sein.

code:

if(!mapOverlays.isEmpty()) { 
    mapOverlays.clear();
    mapView.invalidate();
}

Mehrere Anzahl von Drawable können zu einem einzigen Overlay hinzugefügt werden, die dann auf der Karte hinzugefügt werden können. Daher würde nicht zeichnen x Anzahl der Overlay für x Anzahl der Objekte erforderlich sein, es sei denn, die Objekte unterschiedlicher Typen sind. Code-Auszug.. .. Hier CustomPinPoint ist meine Klasse, die ItemizedOverlay<OverlayItem>

erweitert
CustomPinPoint customPinPoint = new CustomPinPoint(drawable, Main.this);

OverlayItem tempOverLayItem = new OverlayItem(
    touchedPoint, "PinPoint", "PintPoint 2"); //Point One
customPinPoint.insertPinPoint(tempOverLayItem);
tempOverLayItem = new OverlayItem(new GeoPoint(
        (int)(-27.34498 * 1E6), (int)(153.00724 * 1E6)), "PinPoint",
    "PintPoint 2"); //Point Two
customPinPoint.insertPinPoint(tempOverLayItem);
overlayList.add(customPinPoint); //Overlay added only once
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top