在 flex builder 4.5 中,我正在开展像cacoo这样的项目。
我想在关闭应用程序之前保存diagrams(display object,ui components,text)
,而不是在应用程序再次打开之后我能够访问的地方。
更清晰: - 如果用户在此项目上编辑了一些uml图并将其保存以便以后编辑并关闭应用程序。在某些天后,他/她想要编辑以前保存的图表。< /强> 现在我将如何保存此图表以供将来编辑。
答案 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适当的用途是容器。
这是我的测试代码。
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;
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)));
var mySaveData:SharedObject = SharedObject.getLocal("myStorage")
mySaveData.data.myRectInformation = myRectInformation;
mySaveData.flush();
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);