gpt4 book ai didi

javascript - Google Maps InfoBubble pixelOffset(从标记上方的默认位置移动)

转载 作者:可可西里 更新时间:2023-11-01 01:39:34 25 4
gpt4 key购买 nike

我正在尝试实现一个自定义 infoBubble,它的框打开到标记的一侧,而不是默认位置在顶部。事实证明这比预期的要难。

使用普通的 infoWindow,您可以使用 pixelOffset。在这里查看 documentation

使用 infoBubble 似乎并非如此。有没有办法在 infoBubble 中使用 pixelOffset,或者可以做同样事情的东西?

我发现这很难搜索,因为使用这样的谷歌搜索不会返回任何相关结果 Google Search

以下是我一直在使用的所有资源。

  • infoBubble 示例 here .

  • 我的 JavaScript 用于设置 map 和 infoBubble here .

现在我的 javascript 在这里,以防 jsfiddle 链接被破坏。

<script type="text/javascript">

$(document).ready(function () {
init();
});

function init() {

//Setup the map
var googleMapOptions = {
center: new google.maps.LatLng(53.5167, -1.1333),
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
};

//Start the map
var map = new google.maps.Map(document.getElementById("map_canvas"),
googleMapOptions);

var marker = new google.maps.Marker({
position: new google.maps.LatLng(53.5267, -1.1333),
title: "Just a test"
});

marker.setMap(map);

infoBubble = new InfoBubble({
map: map,
content: '<div class="phoneytext">Some label</div>',
//position: new google.maps.LatLng(-35, 151),
shadowStyle: 1,
padding: '10px',
//backgroundColor: 'rgb(57,57,57)',
borderRadius: 5,
minWidth: 200,
arrowSize: 10,
borderWidth: 1,
borderColor: '#2c2c2c',
disableAutoPan: true,
hideCloseButton: false,
arrowPosition: 7,
backgroundClassName: 'phoney',
pixelOffset: new google.maps.Size(130, 120),
arrowStyle: 2
});
infoBubble.open(map, marker);

}
</script>

更新

为了帮助回答这个问题,我在 此处 整理了一个测试用例。重要的行是第 38 和 39 行,它们应指定放置标签的位置。

更新 2

为了获得赏金,我需要查看 infoBubble 的示例,该示例位于标记上方远离其默认位置的位置。最好在标记的右侧。

更新 3

我已经从更新 1 中删除了测试用例,因为它托管在我原来公司的服务器上。

最佳答案

这是我的解决方案。

InfoBubble 库中

替换

整个InfoBubble.prototype.draw方法

/*
* Sets InfoBubble Position
* */
InfoBubble.prototype.setBubbleOffset = function(xOffset, yOffset) {
this.bubbleOffsetX = parseInt(xOffset);
this.bubbleOffsetY = parseInt(yOffset);
}


/*
* Gets InfoBubble Position
* */
InfoBubble.prototype.getBubbleOffset = function() {
return {
x: this.bubbleOffsetX || 0,
y: this.bubbleOffsetY || 0
}
}

/**
* Draw the InfoBubble
* Implementing the OverlayView interface
*/
InfoBubble.prototype.draw = function() {
var projection = this.getProjection();

if (!projection) {
// The map projection is not ready yet so do nothing
return;
}

var latLng = /** @type {google.maps.LatLng} */ (this.get('position'));

if (!latLng) {
this.close();
return;
}

var tabHeight = 0;

if (this.activeTab_) {
tabHeight = this.activeTab_.offsetHeight;
}

var anchorHeight = this.getAnchorHeight_();
var arrowSize = this.getArrowSize_();
var arrowPosition = this.getArrowPosition_();

arrowPosition = arrowPosition / 100;

var pos = projection.fromLatLngToDivPixel(latLng);
var width = this.contentContainer_.offsetWidth;
var height = this.bubble_.offsetHeight;

if (!width) {
return;
}

// Adjust for the height of the info bubble
var top = pos.y - (height + arrowSize) + this.getBubbleOffset().y;

if (anchorHeight) {
// If there is an anchor then include the height
top -= anchorHeight;
}

var left = pos.x - (width * arrowPosition) + this.getBubbleOffset().x;

this.bubble_.style['top'] = this.px(top);
this.bubble_.style['left'] = this.px(left);

var shadowStyle = parseInt(this.get('shadowStyle'), 10);

switch (shadowStyle) {
case 1:
// Shadow is behind
this.bubbleShadow_.style['top'] = this.px(top + tabHeight - 1);
this.bubbleShadow_.style['left'] = this.px(left);
this.bubbleShadow_.style['width'] = this.px(width);
this.bubbleShadow_.style['height'] =
this.px(this.contentContainer_.offsetHeight - arrowSize);
break;
case 2:
// Shadow is below
width = width * 0.8;
if (anchorHeight) {
this.bubbleShadow_.style['top'] = this.px(pos.y);
} else {
this.bubbleShadow_.style['top'] = this.px(pos.y + arrowSize);
}
this.bubbleShadow_.style['left'] = this.px(pos.x - width * arrowPosition);

this.bubbleShadow_.style['width'] = this.px(width);
this.bubbleShadow_.style['height'] = this.px(2);
break;
}
};

然后你可以使用它

var infoBubble = new InfoBubble({
map: map,
content: "My Content",
position: new google.maps.LatLng(1, 1),
shadowStyle: 1,
padding: 0,
backgroundColor: 'transparent',
borderRadius: 7,
arrowSize: 10,
borderWidth: 1,
borderColor: '#2c2c2c',
disableAutoPan: true,
hideCloseButton: true,
arrowPosition: 50,
backgroundClassName: 'infoBubbleBackground',
arrowStyle: 2

});

最后我们不得不使用这个方法setBubbleOffset(x,y);来设置InfoBubble的位置

infoBubble.setBubbleOffset(0,-32);

关于javascript - Google Maps InfoBubble pixelOffset(从标记上方的默认位置移动),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10866098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com