如何在Android设备上加载带有AIR的图像(在我的桌面上工作)

时间:2017-05-18 11:16:58

标签: android actionscript-3 bitmap air

我已经获得了这个拼图代码,用于加载图像,用户将这些拼图放在一起以形成图像。

在我的桌面计算机上运行完美(Adobe Animate上的AIR 25.0),但在尝试使用我的Android设备时,图像似乎无法加载(是的,我确实将它附加到我的项目中)

I did attach it to my project

这是我的代码:

//load picture and set up sprites
function startJigsawPuzzle() {
    // load the bitmap
    loadBitmap("jigsawimage.jpg");

    // set up two sprites
    otherPieces = new Sprite();
    selectedPieces = new Sprite();
    addChild(otherPieces);
    addChild(selectedPieces); // selected on top
}

// get the bitmap from an external source
function loadBitmap(bitmapFile:String) {
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingDone);
    var request:URLRequest = new URLRequest(bitmapFile);
    loader.load(request);
}

// bitmap done loading, cut into pieces
function loadingDone(event:Event):void {
    // create new image to hold loaded bitmap
    var image:Bitmap = Bitmap(event.target.loader.content);
    pieceWidth = Math.floor((image.width/numPiecesHoriz)/10)*10;
    pieceHeight = Math.floor((image.height/numPiecesVert)/10)*10;

    // place loaded bitmap in image
    var bitmapData:BitmapData = image.bitmapData;

    // cut into puzzle pieces
    makePuzzlePieces(bitmapData); 

您认为可能是什么问题?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

首先,无论何时在AS3中使用异步加载器,都应该监听错误以及Event.COMPLETE事件。拥有这些错误监听器可能会提醒您注意这个问题。

这看起来像这样:

loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);

当找不到文件时会触发IO错误事件,安全错误意味着不允许加载文件。还有其他一些你可以听的事件,但这些是你会遇到的主要事件。

很可能,您在移动设备上获得了IO_Error。这是因为移动设备上根应用程序目录的路径需要以app:/开头。这是一个内置的快捷方式,可以访问您的应用程序目录,无论平台如何(因为不同的操作系统在不同的地方/沙箱中运行您的应用程序)。

因此,我建议您将代码更改为:

function loadBitmap(bitmapFile:String) {
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingDone);
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);

    var request:URLRequest = new URLRequest("app:/" + bitmapFile);
    loader.load(request);
}

function ioErrorHandler(event:IO_ErrorEvent):void {
    trace(event); //log or somehow show this error 
}

function securityErrorHandler(event:SecurityErrorEvent):void {
    trace(event): //log or somehow show this error
}

顺便说一下,我还建议在你的loader对象上删除那些监听器,因为只要它仍然在监听这些事件,它们就会将对象及其所有引用保留在内存中。

function disposeBitmapLoader(event:Event):void {
    event.currentTarget.removeEventListener(Event.COMPLETE, loadingDone);
    event.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
    event.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
}

然后在所有事件处理程序中调用该函数,传入事件对象:

function loadingDone(event:Event):void {
    disposeBitmapLoader(event);
    //....rest of code

答案 1 :(得分:0)

如果你只有一张图片并且你总是在使用它,那么考虑使用[Embed]标签直接将它嵌入到swf中:

[Embed(source="jigsawimage.jpg")]
public static var ImageClass:Class;

var myBitmap:Bitmap = new ImageClass() as Bitmap;
var myBitmapData:BitmapData = myBitmap.bitmapData;