软硬度:渲染一个未实现UIComponent:为的BitmapData?(Flex: Render

2019-07-03 11:12发布

什么是呈现一个最好的办法UIComponent尚未添加到舞台? (我用的UIComponents作为渲染的对象,并希望使新的副本图像导出,过滤等)

两种策略我见过/使用到目前为止,包括实现组件,以确保它调用所有的生命周期方法:

  1. 该组件添加到Application.application ,用的BitmapData.draw()渲染,删除组件。 这与我所看到的未实现打印组件,以及完成。

  2. 该组件添加到一个弹出窗口,其中的BitmapData.draw(渲染),渲染完成后解散弹出。

我相信,这两个只是依靠在当前线程/事件被执行,但(1)也可以依靠在组件上正在实现拿出来看不刷新UI。

有没有更好的办法?

Answer 1:

我已经在很多成功的过去使用的是以下情况:

  1. 创建您的组件的新实例
  2. 添加FlexEvent.CREATION_COMPLETE事件侦听器
  3. 设置可见=组件上假
  4. 添加成分为主要应用的孩子
  5. 当创建的组件,事件监听器函数将被调用。 逻辑的其余部分应放在/从你的事件侦听器功能调用
  6. 删除您在第2步添加的事件监听器。
  7. 使用ImageSnapshot.captureImage()或captureBitmapData()来捕获部件的可视化表示。
  8. 从主应用程序中删除该组件
  9. 因为你需要处理图像数据。

我用这个来快照在服务器端生成的PDF文件使用各种Flex图表组件。 得到的BitmapData后,我使用包括PNGEncoder或JPEGEncoder类对数据进行压缩,然后上传到服务器之前对其进行编码为Base64。



Answer 2:

我敢肯定,你可以使用的BitmapData的draw()方法不会对显示列表有您的组件。

例如是使用它,当我需要修改予加载图像与所述装载器类。 在init处理程序创建一个BitmapData实例,并从loadInfo.content财产绘制位图,然后copyPixels()或者任何我需要修改加载的图像



Answer 3:

这么大一个的UIComponent的布局可连接到它的上下文。 这是一个很大的衍生物(如HBox中),因为布局的流动性依赖于它特别真实的母公司的规模和兄弟姐妹共享其父母空间的数量。

另外的Flex可以是一个真正的痛苦得到视觉上的更新。 常关键的渲染功能都没有同步完成...有callLatercallLater2等哈克方法,使处理的自动神奇布局属性UIComponents一大难题。 甚至没有调用validateNowupdateDisplayList可以保证的布局将是正确的当前画面(而不是在未来的几帧)。

我建议你可以做的不是用在UIComponent,并尝试使用雪碧或其他的最好的事情。

你的方法将其固定,但使其不可见( alpha = 0mouseEnabled = falsemouseChildren = false )是体面的。 你应该听的FlexEvent.CREATION_COMPLETE回调您确定它是正确布局之前。 然后,你可以bitmapData.draw它,然后从舞台中删除它。 如果你必须使用的UIComponents然后我知道没有更好的办法。



Answer 4:

您可以使用之前的BitmapData.draw手动调用的生命周期函数()。 请执行下列操作。

  1. createChildren()。
  2. 的commitProperties()。
  3. 的updateDisplayList()。
  4. bmd.draw()。

第2步是没有必要100%,你可以把所有的代码到的updateDisplayList()。 因为你手动调用的功能,你不必担心这是由Flex框架多次调用。



文章来源: Flex: Render an unrealized UIComponent to BitmapData?