我正在创建一个内置WebBrowser控件的.Net库。该库通常应该在其他应用程序中处理谷歌地图。基本上所有必要的google maps api事件都会发送到我的c#lib,然后使用它传递给app。
一切正常,直到使用我的lib的应用程序想要在点击时更改标记图标并在双击时执行不同的操作。在这种情况下,应用程序会在c#级别更改标记图标,而这又会调用javascript函数来更改地图上的图标:
function SetMarkerIcon(id, imageUri) {
markers[id].setIcon(imageUri);
}
我调试了这个问题,结果是javascript冻结直到图像文件被下载,并且对第二次点击没有响应,这应该触发'dblclick'事件。所以我的第一个问题是这是否是正确的思考方式。
基于这个假设,我尝试使用setTimeout延迟下载文件:
function SetMarkerIcon(id, imageUri) {
setTimeout(function () { markers[id].setIcon(imageUri); }, 200);
}
但显然这个解决方案非常“脏”(虽然在测试环境中工作,实际上它在使用本地.js文件时工作甚至延迟0ms,可能是因为setTimeout使用了一种单独的线程,但是没有使用脚本服务器),因此第二个问题:你有没有任何有用的想法如何正确解决这个错误?
如果问题有点含糊,请提前致谢并抱歉。
答案 0 :(得分:1)
您可以使用精灵快速切换标记的图标。您将所有图标作为精灵存储在常规网格位置的一个文件中。您只将此文件加载到浏览器中。您可以通过更改精灵的原点来切换图标。这是一个典型的实现:
var pos = new google.maps.LatLng(0, 0);
var url = "/.../sprites.png"; // file with all icons as sprites
var size = new google.maps.Size(24, 24); // size of 1 sprite
var origin = new google.maps.Point(0, 0);
var anchorPos = new google.maps.Point(12, 12);
var icon = new google.maps.MarkerImage(url, size, origin, anchorPos);
var marker = new google.maps.Marker({
position: new google.maps.LatLng(0, 0),
map: map,
icon: icon
});
marker.getIcon().origin = new google.maps.Point(5 * 24, 0); // set the icon to the 5'th sprite