【问题标题】:clone flex component克隆弹性组件
【发布时间】:2009-07-06 10:53:33
【问题描述】:

我试图在运行时复制一个弹性组件。

例如,如果我有这个

mx:Button label="btn" id="btn" click="handleClick(event)"/>

我应该能够调用一个名为 DuplicateComponent() 的函数,它应该返回一个 UI 组件,它与上面的按钮完全相同,包括事件侦听器。

有人可以帮帮我吗? 提前致谢

【问题讨论】:

    标签: apache-flex adobe copy air


    【解决方案1】:

    进行字节数组复制。此代码段应该为您完成:

    // ActionScript file
    import flash.utils.ByteArray;
    
    private function clone(source:Object):*
    {
        var myBA:ByteArray = new ByteArray();
        myBA.writeObject(source);
        myBA.position = 0;
        return(myBA.readObject());
    }
    

    请注意,这段代码不是我自己编写的,我很确定我是从 Flex Coder 列表上的帖子中得到的。

    【讨论】:

    • 这将复制渲染对象的像素。这不会克隆 Flex 对象,因此它们可以被复制、功能和所有。
    • 我在 ArrayCollections 上使用过这个,在调试模式下运行这个 sn-p 并比较自己:adobe.com/2006/mxml" creationComplete="init()"> 脚本>
    【解决方案2】:

    要解决这个问题,您应该使用 actionscript 并动态创建按钮。

    假设您希望按钮进入一个名为“someVbox”的 VBox

    for (var i:uint = 0; i< 10; i++){
        var but:Button = new Button();
        but.label = 'some_id_'+i;
        but.id = 'some_id_'+i;
        but.addEventListener(MouseEvent.CLICK, 'handleClick');
        someVbox.addChild(but);
    }
    

    我还没有测试过,但如果运气好的话,应该可以在 vbox 中添加 10 个按钮。

    【讨论】:

    • 感谢帮助,但我想要实现的是我有一个画布作为布局设计,其中有一些可编辑的文本区域、图像、动态形状,所以在完成设计过程我需要在单独的弹出窗口中预览整个布局。因此,为此我需要克隆或复制整个布局画布(包括其子项)到弹出窗口中的新画布中。那我怎么能做到这一点。有没有办法做同样的事情。提前感谢
    【解决方案3】:

    您不能在本地获取 UIComponents 的深层副本。最好的办法是创建一个新的并分析您必须添加重复设置的那个。老实说,这听起来确实有点代码味道。我想知道是否有更好的解决方案来重新思考这个问题..

    【讨论】:

    • 感谢 James 的帮助,但我想要实现的是我有一个画布作为布局设计,其中包含一些可编辑的文本区域、图像、动态形状,所以在完成设计过程后,我需要在单独的弹出窗口中预览整个布局。因此,为此我需要克隆或复制整个布局画布(包括其子项)到弹出窗口中的新画布中。那我怎么能做到这一点。有没有办法做同样的事情。提前感谢
    • 我明白了。如果我要创建预览,假设此预览不以任何方式交互,更好的方法是创建一个包含组件的绘制图像的 BitmapData 对象。它将更高效,更清洁。
    • Thanx james .. 这正是我想要的!我已经通过您建议的 BitmapData 方法创建了对象副本,例如: var bd:BitmapData = new BitmapData(layout_cnv.width,layout_cnv.height); bd.draw(layout_cnv); var ba:ByteArray; ba = (new PNGEncoder()).encode(bd); //这个下面的方法应该在弹出窗口的初始化时调用。 Img_new.load(parentApplication.ba),其中 Img_new 是弹出窗口中的图像文件。再次感谢。
    【解决方案4】:

    同样的问题:http://www.flexforum.org/viewtopic.php?f=4&t=1421

    出现在谷歌搜索相同的东西。因此,您在一个月后剪切并粘贴了相同的问题。没有运气吧?

    据我所知,没有简单的方法可以做到这一点。许多组件的设置都依赖于容器/上下文/等...并在创建过程中被实例化,因此没有理由从这个角度进行克隆。

    您可以在 actionscript 中克隆关键设置并在创建新元素时使用这些设置。

    例如,假设您只关心属性,您可能有一个数组 ["styleName","width","height",...],您可以像这样使用该数组:

    var newUI:UIComponent = new UIComponent();
    for each(var s:String in propArray) {
       newUI[s] = clonedUI[s];
    }
    

    如果您希望对您的问题有更多了解(而不是等待一个月),请告诉我们您想要实现的目标。

    【讨论】:

    • 是的,Glenn 说真的,我已经发布了同样的问题,因为要求都与那个相似。我想要实现的是我有一个作为布局设计的画布,其中有一些可编辑的文本区域、图像、动态形状,因此在完成设计过程后,我需要预览整个布局单独的弹出窗口。因此,为此我需要克隆或复制整个布局画布(包括其子项)到弹出窗口中的新画布中。那我怎么能做到这一点。有没有办法做同样的事情。提前致谢。
    • 您基本上需要按照我的建议进行高级形式。您必须跟踪所有布局元素类型、位置和相关属性/样式,并在将其放入弹出窗口时将其全部复制。在这种情况下,我能想到的唯一可能有用的另一件事是“describeType”(scottgmorgan.com/blog/index.php/2007/10/22/…)。但我认为你最终还是会得到某种形式的解析或属性匹配。
    【解决方案5】:

    mx.utils.ObjectUtil 经常派上用场,但是对于复杂的对象类型,实现一个需要 .clone() 方法的接口通常是一种很好的做法,类似于克隆事件的方式。

    例如:

    class MyClass implements ICanvasObject
    {
        ...
    
        public function clone():ICanvasObject
        {
             var obj:MyClass = new MyClass(parameters...);
             return obj;
        }
    }
    

    这使您的代码更加清晰,并在如何使用/克隆对象的上下文中正确封装了关注点。

    【讨论】:

      【解决方案6】:

      您是对的,但根据我的理解 UI 组件不是由 mx.utils.ObjectUtil 克隆的。

      来自:http://livedocs.adobe.com/flex/201/langref/mx/utils/ObjectUtil.html#copy()

      copy() 方法

      公共静态函数副本(值:对象):对象 复制指定的 Object 并返回对副本的引用。该副本是使用本机序列化技术制作的。这意味着在复制期间将尊重自定义序列化。

      此方法设计用于复制数据对象,例如集合的元素。它不适用于复制 UIComponent 对象,例如 TextInput 控件。如果要创建特定 UIComponent 对象的副本,可以创建组件的子类并实现 clone() 方法或其他方法来执行复制。

      参数 value:Object — 应复制的对象。

      返回 Object — 指定对象的副本

      【讨论】:

        猜你喜欢
        • 2020-08-08
        • 2013-09-22
        • 2021-04-08
        • 1970-01-01
        • 2010-12-04
        • 2012-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多