2016-04-08 74 views
1

我终于尝试将我的Flash游戏移植到应用程序,从iOS开始。我被困在图像保存功能上。在瑞士法郎的,我用jpegencoder保存到桌面服务器。似乎有一些研究表明,该代码仍然可以在移动设备上工作,所以我尝试了它,但是在从Adobe AIR进行iPhone测试时似乎没有做任何事情(该按钮注册了一个点击,但没有可以成为图像的图像)发现,没有发生任何事情的通知,不要求访问图像的权限等)。这是旧代码:使用Adobe AIR在iOS上保存位图

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 
} 

所以有更多的研究,我发现这看起来简单,像它专门了iOS版的CameraRoll代码。所以我尝试过,但我遇到了同样的问题:没有证据表明发生了任何事情。没有保存图像,没有错误,没有权限请求。

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

+0

你想在相机胶卷中的图像?或者只是存储在设备上的某个地方,以后可以再次检索它? FileReference我不认为适用于移动设备,您必须使用FileStream和File类保存到应用程序存储目录。你确定'CameraRoll.supportsAddBitmapData'是真的吗? – BadFeelingAboutThis

+0

此外,您应该听取错误,因为相机胶卷addBitmapData方法是异步操作。 'cameraRoll.addEventListener(ErrorEvent.ERROR,handleMyError);',你也可以监听Event.COMPLETE事件。 – BadFeelingAboutThis

+0

应用程序不需要图像。这仅仅是为了用户自己的细读。我不在乎它是否是专门的相机胶卷。我只是希望它在任何习惯这种事情的地方都能保存下来? –

回答

1

所以...相机胶卷代码确实有效,就像我拥有它一样。 它确实是一个非常好的和干净的方式来做到这一点。 我想我遇到了测试问题,只是无法说明它正在工作。

当正常工作时,它会在设备上请求一次权限,之后它会保存而不会通知,因此我添加了一些动画以隐藏“保存”按钮几秒钟,以便用户不会自己滥用垃圾邮件,并且给出一个按钮被按下的视觉提示。

1

移动应用程序的行为与桌面应用程序非常相似,但您的代码无论如何都不适用。例如,您甚至不想使用专门为桌面和移动设备制作的类,如File类。无论如何,在我向您展示您需要忘记为网络执行swf(这是您的代码显示的内容)的步骤之前,您需要移动/桌面应用程序,然后调整您的想法并使用AIR类。

首先,通过提交的ByteArray获取数据:

var byteArray:ByteArray = new ByteArray(); 
bitmapData.encode(new Rectangle(0,0,bitmapData.width,bitmapData.height), new PNGEncoderOptions(), byteArray); 

其次,选择一个目的地(在移动它通常是File.applicationStorageDirectory)和是使用AIR类文件。

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更好,因为它始终可用并可供您使用沙盒。

+0

如果你在iOS上的应用程序存储目录中写入位图数据,我发现它很慢,我使用的ANE写入速度太快 –

+0

唯一的使用Ios上的Adobe AIR进行缓慢操作正在绘制位图数据,该位图数据可能为n * 100ms。 – BotMaster

+0

不这么认为,我试着保存从iphone5捕获的全屏幕,并且与ANE保存位图数据相比,它需要很多保存。 –