我正在实现一个图像库,该图像库将资产显示为大小相等的框,这些框正在形成网格。我以为可以通过使用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
页面。