2012-06-21 23 views
5

Sto utilizzando lo Bing Maps Android SDK e sto cercando un modo per fare clic sui poligoni che ho creato e mostrare una casella di informazioni. Sono stato in grado di realizzare questo per una puntina da disegno, ma non per un poligono. Ho visto this answer, ma la mia app ha bisogno di centinaia di tali poligoni, e sto cercando una soluzione più veloce usando il metodo addHandler sui poligoni. So che questo è possibile per il sapore AJAX v7 dell'SDK, che è la base sottostante dell'SDK di Android.Infobox sui poligoni nell'SDK di Bing Maps per Android

Il codice ho provato per la versione AJAX (testato con this emulatore.)

map.entities.clear(); 
latlon = map.getCenter(); 

var polygon = new Microsoft.Maps.Polygon([new Microsoft.Maps.Location(latlon.latitude, latlon.longitude-0.15), new Microsoft.Maps.Location(latlon.latitude+0.1, latlon.longitude-0.05), new Microsoft.Maps.Location(latlon.latitude+0.1, latlon.longitude+0.05), new Microsoft.Maps.Location(latlon.latitude, latlon.longitude+0.15), new Microsoft.Maps.Location(latlon.latitude-0.1, latlon.longitude+0.05), new Microsoft.Maps.Location(latlon.latitude-0.1, latlon.longitude-0.05), new Microsoft.Maps.Location(latlon.latitude, latlon.longitude-0.15)], null); 
Microsoft.Maps.Events.addHandler(polygon, 'click', DisplayInfo); 

map.setView({zoom:10}); 
map.entities.push(polygon); 

function DisplayInfo (e) { 
    var vertices = e.target.getLocations(); 
    var verticeCenter = new Microsoft.Maps.Location(0,0); 

    //Calculating location of center 
    for (i=0; i<vertices.length-1; i++) { 
     verticeCenter.latitude = verticeCenter.latitude + vertices[i].latitude; 
     verticeCenter.longitude = verticeCenter.longitude + vertices[i].longitude; 
    } 
    verticeCenter.latitude = verticeCenter.latitude/(vertices.length - 1); 
    verticeCenter.longitude = verticeCenter.longitude/(vertices.length - 1); 
    defaultInfobox = new Microsoft.Maps.Infobox(verticeCenter, {width: 200, height: 50});  
    map.entities.push(defaultInfobox); 
} 

Tuttavia, ho spinto un codice simile al BingMapsAndroid.js dalla cartella attivi del SDK, ma che doesn' lavoro. Il gestore è collegato, come ho controllato usando il metodo hasHandler. I tocchi vengono registrati e i loro valori lat e long vengono inviati al log, ma l'evento poligono non viene evocato anche quando il tocco si trova all'interno di un poligono.

funzione di test Poligono in BingMapsAndroid.js:

this.PolygonTest = function() { 
    _map.entities.clear(); 
    latlon = new Microsoft.Maps.Location(1,1); 
    console.log("Polygon test function"); 
    var polygon = new Microsoft.Maps.Polygon([new Microsoft.Maps.Location(latlon.latitude, latlon.longitude-0.15), new Microsoft.Maps.Location(latlon.latitude+0.1, latlon.longitude-0.05), new Microsoft.Maps.Location(latlon.latitude+0.1, latlon.longitude+0.05), new Microsoft.Maps.Location(latlon.latitude, latlon.longitude+0.15), new Microsoft.Maps.Location(latlon.latitude-0.1, latlon.longitude+0.05), new Microsoft.Maps.Location(latlon.latitude-0.1, latlon.longitude-0.05), new Microsoft.Maps.Location(latlon.latitude, latlon.longitude-0.15)], null); 

    try { 
    Microsoft.Maps.Events.addHandler(polygon, 'click', function(e) { console.log("Polygon click!"); }); //This is never evoked 
    Microsoft.Maps.Events.addHandler(_map, 'click', function(e) { var point = new MM.Point(e.getX(), e.getY()); var loc = e.target.tryPixelToLocation(point); console.log("lat: " + loc.latitude + ", lon: " + loc.longitude); }); 

    } catch(e) { 
     alert("Error"); 
    } 

    _map.setView({zoom:10}); 
    _map.entities.push(polygon); 

    if (Microsoft.Maps.Events.hasHandler(polygon,'click')) { 
     console.log("Polygon has click handler."); //This works 
    } 

    //This function should be added to the click handler for polygon. I'll add it when I know the handler works. 
    function DisplayInfo (e) { 
     console.log("Polygon has been clicked."); 
     var vertices = e.target.getLocations(); 
     var verticeCenter = new Microsoft.Maps.Location(0,0); 
     for (i=0; i<vertices.length-1; i++) { 
      verticeCenter.latitude = verticeCenter.latitude + vertices[i].latitude; 
      verticeCenter.longitude = verticeCenter.longitude + vertices[i].longitude; 
     } 
     verticeCenter.latitude = verticeCenter.latitude/(vertices.length - 1); 
     verticeCenter.longitude = verticeCenter.longitude/(vertices.length - 1); 
     defaultInfobox = new Microsoft.Maps.Infobox(verticeCenter, { width: 200, height: 50 }); 
     _map.entities.push(defaultInfobox); 
    } 
} 

risposta

3

Dopo molte prove, ho trovato il problema risiede in Android. Ho provato il codice su Bing Maps Interactive SDK per AjaxV7 e questi sono i miei risultati: i browser

  • desktop: opere (come scritto nella questione)
  • iPhone 4S: opere
  • 2.3.4 Android con predefinito Browser: non funziona
  • 2.3.4 Android con Opera: funziona
  • Android ICS con Opera: funziona
  • ICS Android con il browser di default: non funziona
Problemi correlati