5

私はBingMapsAndroid SDKを使用しており、作成したポリゴンをクリックして情報ボックスを表示する方法を探しています。画鋲ではこれを達成できましたが、ポリゴンでは達成できませんでした。私はこの答えを見てきましたが、私のアプリのニーズは何百ものそのようなポリゴンを作成するでしょう、そして私はポリゴンでaddHandlerメソッドを使用するより速い解決策を探しています。これは、AndroidSDKの基盤となるSDKのAJAXv7フレーバーで可能であることを私は知っています。

AJAXバージョンで試したコード(このエミュレーターを使用してテストしました)。

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

ただし、SDKのassetsフォルダーからBingMapsAndroid.jsに同様のコードをプッシュしましたが、それは機能しません。hasHandlerメソッドを使用してチェックしたので、ハンドラーがアタッチされています。タッチが記録され、それらのlat値とlong値がログに送信されますが、タッチがポリゴン内にある場合でも、ポリゴンイベントは呼び出されません。

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

1 に答える 1

3

多くのテストを行った結果、問題はAndroidにあることがわかりました。AjaxV7用のBingMapsInteractive SDKでコードを試しましたが、結果は次のとおりです。

  • デスクトップブラウザ:動作します(質問に書かれているように)
  • iPhone 4S:動作します
  • デフォルトのブラウザを搭載したAndroid2.3.4:機能しません
  • Operaを搭載したAndroid2.3.4:動作します
  • Operaを搭載したAndroidICS:動作します
  • デフォルトのブラウザを搭載したAndroidICS:機能しません
于 2012-06-22T13:30:32.833 に答える