2017-05-18 1 views
1

J'ai ce code puzzle où il charge une image et l'utilisateur pour assembler les pièces afin de former l'image.Comment puis-je charger une image avec AIR sur un périphérique Android (fonctionne sur mon bureau)

parfait état sur mon ordinateur de bureau (AIR 25.0 sur Adobe Animer), mais en essayant sur mon appareil Android, l'image ne semble pas charger (et oui, je ne l'ai attach à mon projet)

I did attach it to my project

Voici mon code:

//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); 

Que pensez-vous pourrait être le problème?

Merci pour votre aide

+0

Ce que je ferais si je rencontrais un tel problème. 1. Concevoir une sortie de journal (un texte ** TextField ** est bon). 2. Abonnez-vous pour tous les événements possibles (y compris tous les événements d'erreur) de ** Loader.contentLoaderInfo ** et connecté ces événements à la sortie de débogage de p.1 pour voir ce qui se passe. 3. Agissez en conséquence. – Organis

+0

Changez le chemin de votre chargeur de 'jigsawimage.jpg' à' app:/jigsawimage.jpg' ('app: /' est le raccourci multiplate-forme du runtime vers le répertoire de votre application). Si cela fonctionne, faites le moi savoir et je rédigerai une réponse appropriée à votre question. Comme Organis élude à dans leur commentaire, vous devriez toujours écouter IO_ERROR et SECUTIRY_ERROR sur vos chargeurs en plus de COMPLETE afin que vous puissiez savoir ce qui se passe exactement. Très probablement, il s'agit d'une erreur d'E/S car vous devez avoir 'app: /' sur mobile. – BadFeelingAboutThis

+0

@Melissa, avez-vous essayé les suggestions dans ma réponse? S'il vous plaît laissez-moi savoir si cela fonctionne ou ne fonctionne pas pour vous. – BadFeelingAboutThis

Répondre

0

Tout d'abord, chaque fois que vous utilisez un chargeur asynchrone dans AS3, vous devez écouter des erreurs, ainsi que l'événement Event.COMPLETE. Avoir ces auditeurs d'erreur vous alerterait probablement au problème.

qui ressemblerait à quelque chose comme ceci:

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

IO événements d'erreur incendie lorsque le fichier n'a pas été trouvé, les erreurs de sécurité signifie le fichier n'a pas été autorisé à charger. Il y a d'autres événements que vous pouvez écouter, mais ce sont les principaux que vous rencontrerez.

Plus que probable, vous obtenez un IO_Error sur mobile. En effet, le chemin d'accès au répertoire de l'application racine sur mobile doit commencer par app:/. C'est un raccourci intégré dans l'air pour accéder au répertoire de votre application, quelle que soit la plate-forme (différents systèmes d'exploitation exécutent votre application dans différents endroits/sandbox).

Alors, voici ce que je vous recommande de changer votre code:

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 
} 

En aparté, je vous recommande également supprimer les auditeurs sur votre objet de chargeur, comme ils garderont l'objet et toutes ses références en mémoire tant qu'il écoute toujours ces événements.

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); 
} 

Ensuite, appelez cette fonction dans tous vos gestionnaires d'événements, en passant dans l'objet de l'événement:

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

Si vous avez seulement une image et que vous utilisez toujours envisager de toute façon l'intégrer directement dans le swf en utilisant le tag [Embed]:

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

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