2011-05-18 444 views
3

我必须在屏幕上显示大量标签而不重叠。标签的位置应尽可能接近他们描述的特征。这些特征可以是屏幕上的点,线或多边形(想象各种地图)。 我必须满足在我的申请下列要求:如何避免重叠(重叠)标签?

  • 标签必须被定位,以避免overposting(重叠)与其他标签
  • 标签必须被定位,以避免与其它的特征重叠(多边形和线段)
  • 用于标签最佳位置是上方和功能右侧它们描述
  • 下方和右边是少可接受
  • 至少可接受的位置向左

我需要想出一个方法来做到这一点。

在我刚开始试图随意做这件事之前,我希望这里有人可能已经这样做了,并且能够给我一些建议,从哪里开始。

基本上,与标签,我可以使用边界框来比较他们彼此。虽然我不知道这样做的好方法。在他们标记的线段和多边形屏幕上,我真的不知道我应该怎么做才能避免重叠。我希望在避免标签本身重叠的情况下不需要更多的努力。

如果我只需要处理与其他标签重叠的标签,我认为排斥会起作用。但是如果我在一半的屏幕上绘制了一条线段,我不知道如何避免与使用排斥技术的线段重叠。

我使用的语言是ActionScript 3和Flex框架。我不相信Flex有像Java Spring那样的布局管理器类可以为我做这个工作。

无论如何,链接或建议将受到欢迎。我可以允许一些暴力行为;否则我不知道我能做到这一点。谢谢!

PS我相信这个问题的技术术语是“overposting”。

+0

我可以问为什么你需要这样做? – 2011-05-18 14:03:52

+0

当然。这是一张地图。可视区域是动态的。地图要素的位置是唯一提供的数据。但是必须显示标签来描述这些特征(特征可能是点,线或多边形)。显示标签的规则如上所述。 – jpwrunyan 2011-05-18 23:51:39

+0

您是否真的有那么多标签需要避免重叠?似乎太多的信息在屏幕上显示。这就像说当你在谷歌地图上搜索,它不会添加标记,但信息气泡,以及所有他们... – 2011-05-19 03:26:26

回答

0

我没有看到任何方式来完成这个,而没有参考所有标签和其他形状/线条,你需要避免。假设你有这些引用,只需绑定到Flex框架方法。

在updateDisplayList()循环显示标签;并将它们放置在屏幕上的其他所有位置。您可以使用getExplicitOrMeasuredWidth()和getExplicitOrMeasuredHeight()方法来确定相关项目所需的空间。

如果您使用内置的Flex容器,例如VBox或HBox,则标签和其他行将按照彼此定位。或者,如果您使用的是Spark,则VGroup或HGroup将提供相同的功能。