2017-03-06 5 views
0

Ich habe sowohl die externen Lese-und Schreibrechte und angeforderte Berechtigung für sie vom Benutzer hinzugefügt. Ich habe das libgdx-Dateisystem verwendet, um eine Liste von Dateihandles von Bildern zu erstellen, die ich laden möchte. Ich lade sie wie folgt:Libgdx laden Textur von Gdx.files.external() zeigt als schwarze Rechtecke

Wenn ich eines der Bilder rendern rendere ich es nur ein schwarzes Rechteck gerendert. Ich render sie nur mit einem Sprite-Batch mit der .draw-Methode, wie ich es normalerweise tun würde. Irgendeine Idee, warum sie als schwarze Rechtecke rendern? Vielen Dank im Voraus/

Mein Bild Modulcode:

package com.ggi.uparty.ui; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.files.FileHandle; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.graphics.g2d.TextureRegion; 
import com.badlogic.gdx.math.Rectangle; 
import com.ggi.uparty.screens.ImagePicker; 

public class ImagePickerModule { 

public ImagePicker p; 

public FileHandle fh; 

public Texture image = null; 

public TextureRegion load,preview; 


public float theta = 0; 

public Rectangle bounds = new Rectangle(); 

public ImagePickerModule(ImagePicker p, final FileHandle fh){ 
    theta = 0; 
    bounds.width=.85f*Gdx.graphics.getWidth()/6f; 
    bounds.height=bounds.width; 

    load = new TextureRegion(p.u.assets.get("UI/Load.png", Texture.class)); 

    Thread t = new Thread(new Runnable(){ 

     @Override 
     public void run() { 
      try{ 
      //image = new Texture(fh); 

      image = new Texture(fh); 
      System.out.println(fh.path()); 
      float sqSize = image.getWidth()<image.getHeight()?image.getWidth():image.getHeight(); 
      preview = new TextureRegion(image,bounds.x+bounds.width/2-sqSize/2,bounds.y+bounds.height/2-sqSize/2,sqSize,sqSize); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 

     } 

    }); 
    t.start(); 
} 

public void draw(SpriteBatch pic,float fade){ 
    theta++; 
    pic.setColor(1, 1, 1, fade); 
    if(image == null){ 
     pic.draw(load, bounds.x+bounds.width/2 - bounds.height/4, bounds.y + bounds.height/4+theta, bounds.height/4, 
       bounds.height/4, bounds.height/2, bounds.height/2, 1, 1, -theta); 
    } 
    else{ 
     pic.draw(image,bounds.x,bounds.y+theta,bounds.width,bounds.height); 
    } 
} 

} 
+0

Wahrscheinlich Zusammenhang Verlust, aber es ist unmöglich zu sagen, von dieser 1 Codezeile:

dann asynchroner Laden implementieren einen Assetmanager zu erhalten. –

+0

@ p.streef hinzugefügt den Code mit dem Laden und Anzeigen –

Antwort

1

Sie versuchen, eine Textur auf einem Nicht-UI-Thread zu laden. Wenn Sie Texturen asynchron laden möchten, verwenden Sie den Assetmanager.

Um dies zu testen, versuchen Sie, Thread.start in thread.run zu ändern (sofort in dem Thread, in dem Sie sich gerade befinden, also deaktivieren Sie den Thread) das Bild sollte gut geladen werden.

https://github.com/libgdx/libgdx/wiki/Managing-your-assets

+0

thread.start hat nicht funktioniert, aber mit Gdx.app.postRunnable() tat. Möchte den Asset Manager verwenden, aber ich dachte nicht, dass es von externem Speicher laden würde, wird mehr in diesem Dank für die Hilfe schauen! –

+0

@GoodGameIndustries Instanziieren Sie den AssetManager mit einem ExternalFileHandleResolver. – Tenfour04

+0

Gut zu wissen, dass es funktioniert! Zu Ihrer Information: Es sollte funktionieren, wenn Sie thread.run anstelle von thread.start ausführen (im Grunde läuft das runnable, das Sie erstellt haben). Mit postRunnable können Sie auch sofort (da Sie auf dem UI-Thread sind) das gleiche tun. –

Verwandte Themen