如何避免标签重叠?

3
我需要在屏幕上显示大量标签,避免它们重叠。这些标签应尽可能靠近它们所描述的特征。这些特征可以是屏幕上的点、线或多边形(想象一下任何种类的地图)。
我的应用程序需要满足以下要求:
- 标签必须定位以避免与其他标签重叠。 - 标签必须定位以避免与其他特征(多边形和线段)重叠。 - 标签的最佳位置在所描述的特征的上方和右侧。 - 位于下方和右侧的位置较不可接受。 - 最不可接受的位置是左侧。
我需要想出一种方法来实现这个目标。
在随机尝试之前,我希望这里的某个人已经做过这个事情,并能够给我一些建议从哪里开始。
基本上,对于标签,我可以使用边界框将它们彼此进行比较。虽然我不知道如何做到这一点。对于屏幕上的线段和多边形,我真的不知道该怎么做才能避免重叠。我希望除了避免标签本身的重叠之外,不需要更多的努力。
我认为如果我只需要处理标签重叠其他标签,排斥法会起作用。但是,如果我有一条跨越半个屏幕的线段,我不知道如何使用排斥技术避免重叠。
我正在使用Actionscript 3和Flex框架。我认为Flex没有像Java Spring中那样的布局管理器类可以为我完成这项工作。
无论如何,链接或建议都将受到欢迎。我可以允许一些蛮力;否则我看不出如何完成这项工作。谢谢!
PS:我认为这个问题的技术术语是“过度贴图”。

我可以问一下,你为什么需要这样做吗? - J_A_X
当然可以。这是针对地图的内容。可视区域是动态的,提供的唯一数据是地图特征的位置。但是必须显示标签以描述这些特征(特征可能是点、线或多边形)。显示标签的规则就像我上面所描述的那样。 - jpwrunyan
你真的需要那么多标签来避免重叠吗?这看起来是在屏幕上放太多信息了。这就好像说当你在谷歌地图中搜索时,它不仅添加了标记,还添加了所有信息气泡... - J_A_X
当然可以。我只会告诉我的客户:“屏幕上的信息似乎太多了”。我相信他们会理解的。;-) - jpwrunyan
1个回答

0

我没有看到任何不需要引用所有标签和其他需要避免的形状/线条来完成此操作的方法。假设您拥有这些引用,只需连接到Flex Framework方法即可。

在updateDisplayList()中循环遍历标签,并将它们与屏幕上的其他内容相结合进行定位。您可以使用getExplicitOrMeasuredWidth()和getExplicitOrMeasuredHeight()方法来确定所需项目的空间。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接