1

flex mxml カスタム コンポーネント (グラフィック) があります。必要に応じて、コピーまたはカット操作としてそれらをコピーする必要があります。

var className:String = getQualifiedClassName(zorder.getItemAt(0));
            _saveIn.clear();

            registerClassAlias(className, zorder.getItemAt(0) as Class);
            _saveIn   =     SharedObject.getLocal("save");
            _saveIn.data.value1 = new ByteArray();
            _saveIn.data.value1.writeObject(zorder.getItemAt(0));
            _saveIn.data.value1.position = 0;
            _saveIn.flush();
4

2 に答える 2

2

registerClassAlias->writeObject->readObjectアプローチを使用して ByteArray を介して表示オブジェクトの完全なコピーを作成することはできません。データオブジェクト(TextFormat、値オブジェクトなど)などの単純なオブジェクトでのみ機能します。どのような場合でも、オブジェクトのタイプごとに copy メソッドをテストして、正しく動作することを確認する必要があります。

Shape最も単純な表示オブジェクトである対処の例:

package
{
import avmplus.getQualifiedClassName;

import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.Shape;
import flash.net.registerClassAlias;
import flash.utils.ByteArray;
import flash.utils.getDefinitionByName;


public class astest extends MovieClip
{
    public function astest()
    {
        init();
    }

    private function init():void
    {
        var sh:Shape = new Shape();

        sh.graphics.beginFill(0xFF0000);
        sh.graphics.drawEllipse(100, 100, 100, 70);
        sh.graphics.endFill();

        addChild(sh);

        registerObject(sh);

        var ba:ByteArray = new ByteArray();
        ba.writeObject(sh);
        ba.position = 0;
        var obj:Object = ba.readObject();
        var shCopy:DisplayObject = obj as DisplayObject;

        if(shCopy)
        {
            shCopy.x = shCopy.y = 100;
            addChild(shCopy);
        }

    }

    private function registerObject(obj:Object):void
    {
        try
        {
            var qname:String = getQualifiedClassName(obj);
            var cname:String = qname.split("::").join(".");
            var classs:Class = getDefinitionByName(cname) as Class;
            registerClassAlias(qname, classs);
        }catch(error:Error)
        {
            trace(error.message);
        }
    }
}
}

出力:

   TypeError: Error #1034: Type Coercion failed: cannot convert Object@eae09b9 to flash.geom.Transform.

flash.geom.Transformしたがって、対処する前に登録を試みることができます。

registerObject(sh.transform);

しかし、これは別のエラーにつながります:

ArgumentError: Error #1063: Argument count mismatch on flash.geom::Transform(). Expected 1, got 0

実際、DisplayObject対処は古いトピックであり、上記のエラー (特に最後のエラー) でこれに関する多くの投稿をグーグルで検索できますが、答えは次のとおりです。ByteArray 経由で表示オブジェクトをコピーすることはできません。カスタムを記述する必要があります。指定された TextField、Sprite、または VBox のコピーを作成し、すべてのプロパティを手動でコピーするメソッド。

于 2013-01-29T09:14:34.767 に答える
0

わかりました、このブログ投稿には簡単な解決策があります...使用しますgetDefinitionByName()

したがって、コードで次のようになります。

var className:String = getQualifiedClassName(zorder.getItemAt(0));
            _saveIn.clear();

            registerClassAlias(className, getDefinitionByName(className) as Class);
            _saveIn   =     SharedObject.getLocal("save");
            _saveIn.data.value1 = new ByteArray();
            _saveIn.data.value1.writeObject(zorder.getItemAt(0));
            _saveIn.data.value1.position = 0;
            _saveIn.flush();
于 2013-01-29T08:43:41.743 に答える