在flex builder 4.5中,我正在开发像cacoo这样的项目。我想在将应用程序关闭之前保存到某个地方,而不是在应用程序再次打开diagrams(display object,ui components,text)
后能够访问。
更清楚: -如果用户在此项目上编辑一些 uml 图并将其保存以供稍后编辑并关闭应用程序。几天后他/她想编辑以前保存的图。 现在我如何保存此图表以供将来编辑。
在flex builder 4.5中,我正在开发像cacoo这样的项目。我想在将应用程序关闭之前保存到某个地方,而不是在应用程序再次打开diagrams(display object,ui components,text)
后能够访问。
更清楚: -如果用户在此项目上编辑一些 uml 图并将其保存以供稍后编辑并关闭应用程序。几天后他/她想编辑以前保存的图。 现在我如何保存此图表以供将来编辑。
您可以通过 SharedObject 存储图表状态,以便更好地创建一个包含所有图表状态的类,以便以后可以使用
SharedObject 使用http://livedocs.adobe.com/flex/3/html/help.html?content=lsos_5.html
您可以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/
如果保存/打开对话框对您有用,您可以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()
, then FileReference.load()
)。
如果您需要在没有任何对话框的情况下保存/恢复应用程序状态,那么您可能应该使用 AIR(或者SharedObject
,正如 Raja Jaganathan 建议的那样)。但似乎并非如此,因为您希望用户能够在另一个系统中重新打开图表。为此,您应该允许用户将他的工作保存到适当的位置,以便稍后他可以将其移动到另一台机器/系统并使用您的应用程序重新打开它。
另一种选择是将所有内容存储在服务器上并为用户提供已保存文件的列表(就像 Cacoo 所做的那样)。如果采用这种方式,则必须实现相应的服务器端 API。它可能是 REST API 或类似 RTMP 服务器的东西。在 REST API 的情况下,用于FileReference.upload()
将数据上传到您的服务器,然后URLLoader.load()
将其取回。
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);