将应用程序状态保存在磁盘上或稍后用户访问它的位置

时间:2013-01-03 08:26:35

标签: actionscript-3 flex flex4 flex4.6

flex builder 4.5 中,我正在开展像cacoo这样的项目。  我想在关闭应用程序之前保存diagrams(display object,ui components,text),而不是在应用程序再次打开之后我能够访问的地方。

更清晰: - 如果用户在此项目上编辑了一些uml图并将其保存以便以后编辑并关闭应用程序。在某些天后,他/她想要编辑以前保存的图表。< /强> 现在我将如何保存此图表以供将来编辑。

3 个答案:

答案 0 :(得分:1)

您可以通过SharedObject存储图表状态,以便更好地创建一个类,该类保存您的所有状态图,以便以后可以使用

使用http://livedocs.adobe.com/flex/3/html/help.html?content=lsos_5.html

的SharedObject

您可以将registerClassAlias用于存储在sharedobject中的自定义类。

myClassInstance = new MyClass();
myClassInstance.x = 100;
myClassInstance.y = 100;
myClassInstance.text = "diagrams";

registerClassAlias("com.path.to.MyClass", MyClass);
myStuff = SharedObject.getLocal("myAppStuff");
myStuff.data.whatINamedIt = myClassInstance;
myStuff.flush();

现在什么时候回来......你可以说:

myStuff = SharedObject.getLocal("myAppStuff");
var mySavedClass:MyClass = myStuff.data.whatINamedIt as MyClass;

读取mySavedClass实例值,然后在再次打开时注入图模型。

实施应用程序关闭事件

http://www.flexer.info/2007/10/25/fabridge-warn-on-flex-application-exit/

答案 1 :(得分:1)

如果保存/打开对话框适合您,您可以使用FileReference API。在执行此操作之前,您必须在String / ByteArray / XML对象中实现对州的序列化/反序列化。

private var fileReference:FileReference;

// due to security restrictions, this method must be called from an
// event handler that responds to a user event (mouse click or key
// press), otherwise it will fail.

private function saveState(serializedState:*, fileName:String):void {
    fileReference = new FileReference();

    fileReference.addEventListener(Event.COMPLETE, onSaved);
    fileReference.addEventListener(IOErrorEvent.IO_ERROR, onSavingError);

    try {
        fileReference.save(serializedState, fileName); // will open save dialog
    } catch (e:Error) {
        trace("error saving data: " + e.toString());
        freeListeners();
    }
}

private function onSaved(e:Event):void {
    trace("saved!");
    freeListeners();
}

private function onSavingError(e:ErrorEvent):void {
    trace("error saving data: " + e.toString());
    freeListeners();
}

private function freeListeners():void {
    fileReference.removeEventListener(Event.COMPLETE, onSaved);
    fileReference.removeEventListener(IOErrorEvent.IO_ERROR, onSavingError);
}

与恢复状态类似(使用FileReference.browse(),然后FileReference.load())。

如果您需要在没有任何对话框的情况下保存/恢复应用状态,那么您应该使用AIR(或SharedObject,如Raja Jaganathan建议的那样)。但似乎并非如此,因为您希望用户能够在另一个系统中重新打开图表。要实现这一点,您应该允许用户将他的工作保存到适当的位置,以便稍后他可以将其移动到另一台机器/系统并使用您的应用程序重新打开它。

另一种方法是将所有内容存储在服务器上,并为用户提供已保存文件的列表(如Cacoo)。如果你这样做,你将不得不实现相应的服务器端API。它可能是REST API或像RTMP服务器一样的smth。对于REST API,使用FileReference.upload()将数据上传到您的服务器,并使用URLLoader.load()将其获取回来。

答案 2 :(得分:1)

Sprite或MovieClip其他DisplayObject对象无法直接序列化。所以你应该存储对象信息(原始x,y,宽度,高度,颜色,子信息......)。使用ByteArray或Array或Dictionary ...并保存到ShareObjects。稍后从ShareObject回滚并重新创建原始对象。 MovieClip或Sprite适当的用途是容器。

这是我的测试代码。

1。创建一个Movieclip。目的是容器。

enter image description here

2。使用图形绘制一个矩形。并设置坐标。

var drawWidth:Number = 500;
var drawHeight:Number = 300;

var rect:MovieClip = new MyRect();
rect.graphics.beginFill(0xffffff*Math.random(),1);
rect.graphics.drawRect(0,0,drawWidth,drawHeight);
rect.graphics.endFill();
rect.x= 300;
rect.y= 100;

3。将信息存储在数组中。

var myRectInformation:Array = new Array();
myRectInformation.push(rect.x);
myRectInformation.push(rect.y);
myRectInformation.push(drawWidth);
myRectInformation.push(drawHeight);
var bmd:BitmapData = new BitmapData(rect.width, rect.height,true,0);
bmd.draw(rect);
//is byteArray.
myRectInformation.push(bmd.getPixels(new Rectangle(0,0,bmd.width,bmd.height)));

4。保存到SharedObjects,数组。

var mySaveData:SharedObject = SharedObject.getLocal("myStorage")
mySaveData.data.myRectInformation = myRectInformation;
mySaveData.flush();

5。这是从存储的SharedObject数据加载的。并重新创建对象。

var rect:MovieClip = new MyRect();
var loadBmd:BitmapData = new BitmapData(mySaveData.data.myRectInformation[2], mySaveData.data.myRectInformation[3], true, 1);
loadBmd.setPixels(new Rectangle(0,0,loadBmd.width,loadBmd.height), mySaveData.data.myRectInformation[4]);
var bmp:Bitmap = new Bitmap(loadBmd);
rect.addChild(bmp);
rect.x = mySaveData.data.myRectInformation[0];
rect.y = mySaveData.data.myRectInformation[1];
addChild(rect);