Pregunta

Quiero hacer lo siguiente y estoy un poco atascado en ellos durante unos días:

  1. Yo estaba tratando de dibujar polilíneas (He codificado polilíneas, pero he logrado descifrar los) que se mueven cuando muevo el mapa .
    La única solución que encontré fue para geopuntos a transformarse en coordenadas de pantalla ... que no se moverá si muevo el mapa.

  2. Solía ??HelloItemizedOverlay que añadir sobre 150 marcadores y se pone muy muy lento .
    Cualquier idea de qué hacer? Estaba pensando en las discusiones (handler).

  3. Yo estaba buscando una especie de función de temporizador que ejecuta una función dada periódicamente , por ejemplo, cada 1 minuto más o menos.

  4. Me estaba también buscando maneras de borrar el mapa de Google de todos los marcadores / líneas , etc.

¿Fue útil?

Solución

respuestas dadas a continuación:

1) Aquí hay una solución que utilicé:

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

cortesía: Trazar una línea / ruta en Google Maps

2) Esto es lo que funcionó para mí:

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 
} 

y en MyOverlay:

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

public void populateNow()
{
    populate(); 
}

cortesía: stackoverflow.com enlace desconocido

3) La mejor forma de hacerlo es utilizar una clase temporizador. Una descripción muy detallada de la clase temporizador y cómo utilizarlo se da en el siguiente enlace:

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

4) I utiliza este código:

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

Esperamos que estas respuestas ayuda al menos una otra persona. Gracias.

Otros consejos

Tengo el mismo problema. Estamos desarrollando una aplicación para iPhone y Android una aplicación al mismo tiempo. Tengo 2500 superposiciones + mapa. No hay problema en el iPhone; un enorme impacto en el rendimiento en Android cuando se llama a poblar () después de añadir todas las superposiciones. (Por supuesto, mi primer intento fue llamar a poblar () cada vez que después de añadir una superposición; un error típico debido al tutorial de Google Ahora estoy llamando poblar () sólo una vez, después de todos 2500+ superposiciones se han añadido a la ItemizedOverlay.. )

Así que la única poblar () llamada toma más de 40 segundos para completar en un dispositivo HTC Hero. Tenía que poner en un indicador de ocupado; sin barra de progreso es posible porque no podemos obtener ninguna información sobre el progreso de poblar ().

He intentado otra solución: No utilice ItemizedOverlay además de añadir superposiciones con la mano, la subclasificación de superposición. Resultado: de hecho, es mucho más rápido para agregar todas esas superposiciones al mapa; Sin embargo, el mapa se vuelve inutilizable debido a la llamada constante del método draw () en cada capa. En mi método draw, he tratado de optimizar tanto como sea posible; No crear un mapa de bits cada vez. Mi draw () miradas método como este:

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

}

A continuación se markerBitmap precalculados. No sé qué más podría optimizar. ¿Hay algún tipo de poblar () Llamada necesario si no estamos utilizando ItemizedOverlay ??? No pude encontrar ningún buenas respuestas para eso.

Ahora mismo recurrir a almacenamiento en caché el ItemizedOverlay una vez que se ha creado en un subproceso de fondo. De esta manera, al menos, el usuario no tiene que esperar cada vez.

Para # 2, no creo que usted ha resuelto nada allí. Su código difícil de lectura se representa cómo poner marcadores en superposición y, a continuación, cómo añadir que la superposición al mapa. Eso es exactamente cómo lo hago. Tengo mapa con cerca de 300 hoteles y se tarda unos 5 segundos para Android en mi Nexus One para crear marcadores. Todo el asunto se está ejecutando rosca interior y yo supongo que tendrá que hacer algún tipo de barra de progreso para dar a conocer usuario de lo que está pasando.

Estoy trabajando en la aplicación que ya existe en el iPhone y parece que iPhone no tiene ningún problema para dibujar casi instantáneamente estos más de 300 marcadores. Voy a tener dificultades para explicar la existencia de la barra de progreso para mis jefes.

Si alguien tiene idea de cómo optimizar este proceso ... estaré agradecido.

Aquí está mi código:

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

Sé que podría ahorrar algo de tiempo al evitar esta conversión String> doble, pero no siento que me daría un importante ahorro .. o lo haría?

Para su cuarta pregunta .... basta con utilizar el mapOverlays.clear (); método y todos los marcadores anteriores se desvanecieron.

código:

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

número múltiple de objetos estirables se puede añadir a una sola superposición que luego se pueden añadir al mapa. Por lo tanto, dibujo x número de la superposición de un número x de objetos no sería necesario a menos que los objetos son de diferentes tipos. Fragmento de código.. .. Aquí, CustomPinPoint es mi clase que se extiende ItemizedOverlay<OverlayItem>

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top