0

我创建了一个像 Viewstack 一样工作的组件,但下一个索引组件从四个侧面之一滑入。我已经让它工作得很好,可以接受使用,但我想让它更有效率。

现在,我使用 Canvas 作为基础组件,使用 ImageSnapshot ( new Bitmap( ImageSnapshot.captureBitmapData( this ) )) 创建当前视图的快照,并在索引更改时将新索引滑动到该图像的顶部。

我基本上是在寻找有关如何以更好的方式做到这一点的建议。通过在组件加载后和幻灯片发生后获取图像,我已经将最初的厌倦移动降到了最低限度,但我们通常使用它来转换网格,因此在第一张或前几张幻灯片上它几乎总是很慢。

到目前为止,这是其中的一些内容:

private function creationComplete(e:Event):void
{
  tmpImage.source = new Bitmap( ImageSnapshot.captureBitmapData( this ) );
}

public function set selectedIndex(value:int):void
{
  if(_selectedIndex == value + 1)
    return;
  _selectedIndex = value+1;

  var obj:UIComponent;

  tmpImage.height = height;
  tmpImage.width = width;
  tmpImage.visible = true;
  tmpImage.x = 0;
  //tmpImage.includeInLayout = true;

  for (var i:int = 1; i < numChildren; i++)
  {
    obj = UIComponent(getChildAt(i));
    //obj.x = width;
    if(i == _selectedIndex){
      obj.visible = true;
      objDisplay = obj;
    }
    else
      obj.visible = false;
  }

  mv1.target = tmpImage;
  mv2.target = objDisplay;

  switch ( direction )
  {
    // X/Y sliding logic
  }
  parEfect.play();

  tmpImage.source = new Bitmap( ImageSnapshot.captureBitmapData( this ) );
}

如果您想知道,我将画布的索引 0 用于图像,并将我的自定义 selectedIndex 偏移 1。

如果需要,我会发布更多内容,但我想将问题降到最低限度,这几乎可以概括。

任何帮助是极大的赞赏!我真的想让这个组件表现得更好。此外,这必须使用 Flex 3 来完成

4

4 回答 4

2

mv1 和 mv2 是什么?它们是 Flex 效果器吗?如果是这样,它们是出了名的慢,我建议使用TweenLite。如果您绝对需要使用它们,请设置suspendBackgroundProcessing = true它们。最后但并非最不重要的一点是,确保您没有在它们上设置布局。如果你这样做,你会导致每帧重新布局,这很容易使动画陷入困境。

于 2010-11-26T17:17:52.913 回答
1

您可能会从正在创建的所有组件中获得一些内存命中,然后立即将其转换为图像。我肯定会尝试在创建时添加一些智能。在创建映像之前,请尝试检查内存使用情况并针对最大内存负载进行测试:

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/System.html

但是,我需要查看对象中正在创建的内容。我怀疑您在每个视图中都加载了一些非常重的对象。如果您从服务器加载每个对象的数据,可能会有延迟。

设置一个优先队列,用于在正在创建的类中创建对象。. . 例如,如果您有一个默认隐藏的菜单系统,请加载前端,然后仅在用户单击它时加载菜单下拉菜单,或者在创建所有其他立即可见的对象之后加载。您还可以在所有立即可见的对象就位时以及在创建隐藏对象之前拍摄快照。

最后,如果可以的话,在对象创建之后添加事件监听器,并记得尽快移除监听器。

于 2010-11-22T19:47:55.363 回答
0

了解您如何创建Move效果会很有帮助,mv1并且mv2. 可以设置 、 和/或 属性的组合*From-*To*By控制补间速度/持续时间的属性的各种操作 - 一起可能导致生成的动画中的“抖动”或“抖动”。

当然,你也有可能遇到某种性能障碍,但我怀疑这是更阴险的事情。只要剪辑没有被旋转、倾斜或缩放,任何剪辑的简单平移(“x/y 滑动”)都应该表现得相对较好;并且只要处理器没有被同时进行的其他一些操作完全耗尽。

在大多数情况下,在定义Move效果时,您希望设置尽可能少的信息,并让 Flex 计算其他事物的最佳值。通常,这意味着仅设置xToyTo

此外,请务必end()在开始设置新值之前调用补间(以防任何先前的序列仍在运行)。

最后 - 确保在补间期间您没有与组件的布局管理器竞争。在补间运行时,您应该完全禁用布局(通过在容器组件上进行设置autoLayout=false)——或者您可以(临时)将布局更改为绝对布局。无论哪种方式,必须允许补间在运行时移动东西,并且移动东西不能导致布局管理器重新计算东西,直到一切结束。完成后,您可以重新启用您最初拥有的任何布局管理器。

于 2010-11-28T23:06:52.033 回答
0

您使用 Flex 3 还是 Flex 4?

因为如果您使用 Flex 4,我建议您使用 Animate Filter 和 Shader Filter。着色器过滤器使用 Pixel Bender,因此您可以在 Pixel Bender 中构建一个着色器,该着色器将在您的 2 个图像之间进行过渡。

有关更多信息,请参阅这 2 个视频:

http://tv.adobe.com/watch/codedependent/pixel-bender-shaders-and-flex-4/

http://tv.adobe.com/watch/codedependent/shader-transitions-in-flex-4

于 2010-11-28T11:46:01.053 回答