当前位置: 首页 > 知识库问答 >
问题:

调整MapView以显示整个弹出气泡

奚卓
2023-03-14

我正在使用MapView.addView()在点击OverlayItem标记时在其顶部显示一个弹出气泡。有时,弹出视图会延伸到显示屏的边缘之外,这是因为它包含的信息量大,或者因为点击的标记靠近地图的边缘。如何确定弹出视图不适合的时间,然后调整地图的位置,从而显示整个弹出视图?

共有1个答案

岳永思
2023-03-14

我问这个问题已经有三个月了,所以我想我会把我想出的解决方案贴出来,以防万一有人看到这个帖子。此方法是扩展mapview的类的一部分。

/**
 * Repositions the map, if necessary, in order to fully display the view passed in.  Mainly used
 * by the map bubbles displayed when tapping on an overlay item marker.  It's important that the
 * view passed in has already been laidout by the system so its measurements are available.
 *
 * @param view The being displayed on the map.
 */
private void recenter(View view) {
  Display display = windowManager.getDefaultDisplay();

  // Get the dimensions of the physical display screen.  These will differ based on the orientation
  // of the device.
  int displayWidth  = display.getWidth();
  int displayHeight = display.getHeight();

  // Get the coordinates of the top left and bottom right corners of the view.
  Point topLeft     = new Point(view.getLeft(),  view.getTop());
  Point bottomRight = new Point(view.getRight(), view.getBottom());

  // Will be used to convert between map coordinates and pixels.
  Projection projection = getProjection();

  // Get the pixel coordinates for the map's current center and use that to initialize a new point
  // object that will be used to reposition the map if necessary.
  Point mapCenter = projection.toPixels(getMapCenter(), null);
  Point newCenter = new Point(mapCenter);

  // Adjust the "x" coordinate if necessary.
  if (topLeft.x < 0) {
    newCenter.x += topLeft.x;
  }
  else if (bottomRight.x > displayWidth) {
    newCenter.x += bottomRight.x - displayWidth;
  }

  // Adjust the "y" coordinate if necessary.
  if (topLeft.y < 0) {
    newCenter.y += topLeft.y;
  }
  else if (bottomRight.y > displayHeight) {
    newCenter.y += bottomRight.y - displayHeight;
  }

  // Reposition the map only if the newly calculated center differs from the original.
  if (!newCenter.equals(mapCenter)) {
    getController().animateTo(projection.fromPixels(newCenter.x, newCenter.y));
  }
}

有一件事让我感到困惑,那就是如何确保传入的视图具有可用的测量值。我通过注册一个侦听器来确定视图何时被系统布局来解决这个问题,如下所示:

// Add a listener to determine when the layout for the "mapBubbleMsg" view has been completed.
// This will be used to reposition the map if necessary so the newly added view is visible.
mapBubbleMsg.getViewTreeObserver().addOnGlobalLayoutListener(mapBubbleMsgLayoutListener);

下面是听众:

/**
 * Listen for layout changes to the "mapBubbleMsg" view.  This will be used to reposition the map
 * if necessary so the "mapBubbleMsg" view is visibile.  The first thing this listener does is
 * unregister itself in order to prevent it from being called repeatedly each time the "mapBubbleMsg"
 * view layout changes.
 */
ViewTreeObserver.OnGlobalLayoutListener mapBubbleMsgLayoutListener = new
ViewTreeObserver.OnGlobalLayoutListener() {
  public void onGlobalLayout() {
    mapBubbleMsg.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    recenter(mapBubbleMsg);
  }
};

我希望这能帮到其他人。

 类似资料:
  • 问题内容: 我正在尝试创建一个“气泡”,该气泡可以在事件触发时弹出,并且只要鼠标悬停在引发事件的项目上方,或者如果鼠标移入气泡中,它就会保持打开状态。我的泡沫将需要具有各种HTML和样式,包括超链接,图像等。 我基本上通过编写约200行丑陋的JavaScript来实现了这一目标,但是我真的很想找到一个jQuery插件或其他一些方法来解决这一问题。 问题答案: Qtip是我见过的最好的Qtip。它是

  • 本文向大家介绍JupyterNotebook 输出窗口的显示效果调整实现,包括了JupyterNotebook 输出窗口的显示效果调整实现的使用技巧和注意事项,需要的朋友参考一下 在使用JupyterNotebook时,经常会遇到输出结果行数过长,结果显示时自动给放进了一个带有滚动条的小窗口。但是我们就是想一次看到全部结果,该怎么办? 其实非常简单,找到上方一排英文的工具栏,点击cell,再点击c

  • 我想在键盘出现时重新定位布局,例如在编辑文本字段时,以便在聚焦字段上获得可见性。我尝试了WindowsofInputMode,但没有任何区别。如何到达它?非常感谢。

  • 大家早上好,当显示键盘时,我有一个关于调整布局大小的小问题。 在清单中,我有调整调整大小,我也试图使用调整潘,但我有问题与滚动的回收器视图。 我的布局代码是: 谢谢,谁能帮我

  • 我正在开发一个swing应用程序(让我们忽略为什么)。 我需要做一个自定义设计的滚动条。到目前为止还不错,我实现了我的ScrollBarUI后代-我有自定义按钮,自定义拇指,自定义轨道...除了按钮周围的区域-我在那里添加了一些填充,我想把我所有的滚动条包装成一个圆角矩形。 由于我在ScrollBarUI中没有找到这样做的方法,我决定扩展JScrollPane(扩展那里使用的ScrollBar,这

  • 调整影像输出     调整PSP™的影像输出 提示 显示器按钮按住5秒钟以上后,亦能调整调整影像的输出位置。再度按下显示器按钮,即会改回原先的设定。 启用(设定) > (省电设定) > [自动睡眠]后,即会自动改回原先的输出设定。