我正在实现一个图像库,该图像库将资产显示为大小相等的框,这些框正在形成网格。我以为可以通过使用spark.layouts.TileLayout轻松实现这一目标,但是不幸的是,我还有一些其他要求无法实现。

一般原则是在给定的空间内放置尽可能多的盒子。应用程序的整体布局为liquid,并取决于用户的屏幕分辨率。

我从带有DataGroup的基本TileLayout开始:

<s:DataGroup id="dgpImages" width="100%" height="100%" top="12" dataProvider="{ list }"
    minHeight="0" minWidth="0" clipAndEnableScrolling="true" itemRenderer="LibraryImageRenderer">
    <s:layout>
        <s:TileLayout orientation="rows" clipAndEnableScrolling="true"
            requestedColumnCount="-1" requestedRowCount="-1"
            verticalGap="12" horizontalGap="12" useVirtualLayout="true" />
    </s:layout>
</s:DataGroup>


我事先不知道RequestedColumnCount或RequestedRowCount,因为它们取决于可用空间,因此上面的代码对left-to-right然后是top-to-bottom的所有元素进行布局-距我真正想要的内容尽可能近达到。

问题

此框列表应该是呈现假页面的电缆。实际上,这意味着如果最后一个可见行不完全适合可用空间,则应将其移至下一页。

举一个例子,让我们想象一下,我们有10张图像的列表。每个像素都是10x10像素,但我的屏幕分辨率只能使我适合35x35像素的网格。这意味着一页只能显示3x3网格形式的9张图像(因为5 px不足以显示完整图像)。然后应将第10张图像转移到第二页。

问题

我上面粘贴的代码显然不会自动发生,因为TileLayout允许显示部分可见的行(以垂直滚动列表的形式)。我想知道如何实现上述行为。

如果上述说明听起来不合逻辑,请告诉我,以便我进行调整(或提供更多详细信息)。

任何帮助,将不胜感激!

最佳答案

您需要为此功能创建自定义布局。好消息是,我在这里找到了一个教程,几乎可以完成您想要为您做的事情:

http://www.adobe.com/devnet/flex/articles/spark_layouts.html

因此,请先实施。在updateDisplayList()方法中,查找以下行:

if (x + elementWidth > containerWidth)


在检查是否将其撞到下一行时,您将检查总高度与当前行高的关系,并在超出边界时停止添加元素。 (只是break在for循环之外)

然后,您要做的就是根据当前页面为该组的dataProvider页面。

09-25 23:07