标记图标位置偏移

时间:2016-12-20 05:38:35

标签: android mapbox

我有一个带箭头的针。放置标记时,尖端实际上并未准确指向水龙头位置。看来我的针脚定位在它们的中心位置。我想通过一个特定的偏移来移动这个中心。

这是我目前正在使用的(我有许多其他自定义引脚)。它们的大小为250x250:

enter image description here

这是一个圆形按钮。请注意,它最底部有一个箭头(指向下方)。

现在,我们将此图钉放在地图框上:

@Override
public void onMapClicked(@NonNull LatLng point)
{
    mPopularView.showPinSelectedPopup(false);

    if(!mIsOnMyRecommendationMode)
        return;

    IconFactory iconFactory = IconFactory.getInstance(getContext());
    Drawable iconDrawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_map_bank_blue_pin);
    Icon icon = iconFactory.fromDrawable(iconDrawable);

    MarkerOptions markerOption = new MarkerOptions();
    markerOption.setPosition(point);
    markerOption.title("Just a I don't know where I am!");
    markerOption.setSnippet("Hello World! I don't know where I am!");
    markerOption.setIcon(icon);

    mPopularView.getMapboxMap().addMarker(markerOption);

    mIsOnMyRecommendationMode = false;
}

相当简单,就像在文档中一样。它工作得很好。请看下面的图片:

enter image description here

我希望这张照片会画上千言万语。 请不要建议调整LatLang来计算偏移量。这在我的用例上是不正确的。它必须是图标本身的像素位置。当MapBox允许开发人员开发他们自己的定制引脚时,MapBox应该已经解释了这一点(我们将在我们的PIN上使用ARROWS!)。

目前,我将自定义图钉图标的高度设置为高度的两倍。但我发现一个警告是,我实际上可以选择现在较长的图钉图标的下半部分。例如:

enter image description here

注意上面的图片。该图像的高度增加了一倍。当我放置它时,现在箭头正确指向我拍摄的区域。需要注意的是,当您按下引脚下方时,它仍会检测到单击回调。猜猜为什么......因为自定义图标的边界(特别是高度)更长,其点击边界也更长。因此,我无法将引脚置于其下方,因为它将其检测为onMarkerClicked()

我该如何解决这个问题?有什么想法吗?

谢谢!

不那么优雅的解决方案

只是想将其作为答案发布,以防其他人遇到同样的情况。我的情况有点极端,我真的需要在引脚上加载位图而不是cammace提出的其他方法。我使用老式的像素定位来获得我想要的。幸运的是,MapBox配备了转换屏幕坐标来映射坐标,反之亦然。

我在平板电脑和手机上都进行了测试,但它似乎没有受到屏幕尺寸的影响。它尖尖的边缘现在实际上指向我指定的目标:

LatLng position = new LatLng();
position.setLatitude(lat);
position.setLongitude(long);

PointF pointF = mMapboxMap.getProjection().toScreenLocation(position);
pointF.offset(0f, -(icon.getBitmap().getHeight() / 2.0f));

position = mMapboxMap.getProjection().fromScreenLocation(pointF);

这不是最优雅的解决方案。我希望这可以帮助像我一样处于类似情况的人。向上轻推引脚只是代表性的,我仍然从原来的自制服务器中读取引脚的原始latlong值,我只是在标记放置期间将latlong值略微向上放置。

缩放也似乎没有受到影响,我尝试了不是按像素放置它而是使用此解决方案放置它。

正如我所说,如果这是完全错误的。让我知道。

如果对这种方法有一些警告。请告诉我。

1 个答案:

答案 0 :(得分:1)

上周发布4.2.0后,我们有三种添加标记的方法。您添加它们的当前方式确实意味着您需要为图像添加填充以使图像居中(这是我们使用default marker进行的操作)。

您拥有的第二个选项是使用MarkerViews。只需更换此行:

MarkerOptions markerOption = new MarkerOptions();

到此:

MarkerViewOptions markerOption = new MarkerViewOptions();

这将公开更多选项,包括锚定选项。标记视图有一个问题就是性能,因此如果您要添加大量标记或者不喜欢它们与地图略微不同步,那么您有第三个选项。

第三个选项是使用运行时样式创建符号图层并使用style spec中的偏移属性。请查看我们的演示应用程序中的this example,以便更好地了解使用运行时样式的可能性。