我终于尝试将我的Flash游戏移植到应用程序,从iOS开始。我被图像保存功能卡住了。在swf中,我使用jpegencoder保存到桌面服务器。经过一些研究,该代码似乎仍然可以在移动设备上运行,所以我尝试了一下,但在Adobe AIR的iPhone上测试时,它似乎没有任何作用(按钮注册了一次点击,但找不到任何图像,没有任何事情的通知,也没有请求访问图像的许可等)。这是旧代码:
saveToDisc.addEventListener(MouseEvent.CLICK, saveToDiscSave);
function saveToDiscSave(e:MouseEvent):void {
this.visible = false; //hides menu
var bitmapData:BitmapData = new BitmapData(1242,1864);
bitmapData.draw(MovieClip(root));
var jpgEncoder:JPGEncoder = new JPGEncoder(80);
var byteArray:ByteArray = jpgEncoder.encode(bitmapData);
var fileReference:FileReference=new FileReference();
fileReference.save(byteArray, "Dinogeddon-DollDivine.jpg");
//this.visible = true; //returns menu. commented out to see if click registered
}
因此,经过更多的研究,我发现了CameraRoll代码,它看起来很简单,就像是专门为iOS制作的。所以我试过了,但我也遇到了同样的问题:没有证据表明发生了什么。没有保存任何图像,没有错误,没有权限请求。
saveToDisc.addEventListener(MouseEvent.CLICK, saveToDiscSave);
function saveToDiscSave(e:MouseEvent):void {
this.visible = false;
var cameraRoll:CameraRoll = new CameraRoll();
var bitmapData:BitmapData = new BitmapData(1242,1864);
bitmapData.draw(MovieClip(root));
cameraRoll.addBitmapData(bitmapData);
//this.visible = true;
}
比如,我甚至不知道自己哪里错了。。处于测试模式的应用程序是否能够保存图像?我应该期待某种通知弹出吗?保存到手机的东西有大小限制吗?HALP
所以。。。相机胶卷编码确实有效,就像我用的一样。这确实是一种非常好和整洁的方式。我想我在正确测试方面遇到了问题,只是无法判断它是否有效。
当工作正常时,它会在设备上请求一次权限,然后在没有通知的情况下保存,所以我添加了一些动画,将"保存"按钮隐藏几秒钟,这样用户就不会自己发送垃圾邮件,并给出按钮被按下的视觉提示。
移动应用程序的行为与桌面应用程序非常相似,但您的代码并没有真正适应这一点。您甚至没有尝试使用专门为桌面和移动设备制作的类,例如File类。无论如何,在我向你展示你需要忘记为网络做swf的步骤之前(这就是你的代码所显示的),你想要移动/桌面应用程序,然后让你的思维适应它,并使用AIR类。
首先,通过提交字节数组来获取数据:
var byteArray:ByteArray = new ByteArray();
bitmapData.encode(new Rectangle(0,0,bitmapData.width,bitmapData.height), new PNGEncoderOptions(), byteArray);
其次,选择一个目的地(在移动设备上通常是File.applicationStorageDirectory),然后使用AIR类File。
var dest:File = File.applicationStorageDirectory.resolvePath("mypng.png");
第三,您得到了数据,得到了目的地,现在使用AIR类FileStream保存:
var stream:FileStream = new FileStream();
stream.open(dest, FileMode.WRITE);
stream.writeBytes(byteArray);
stream.close();
仅此而已。使用File类在存储目录中创建目录和文件。小心,在移动设备上,您将不被允许将文件保存在任何地方,这就是为什么使用applicationStorageDirectory更好,因为它总是可用的,并且是沙盒式的,供您使用。