5

ネットワーク経由で画像をダウンロードし、これを使用して画像アクターとしてlibgdxUIに追加します。

Pixmap pm = new Pixmap(data, 0, data.length);
Texture t = new Texture(pm);
TextureRegion tr = new TextureRegion(t,200,300);
TextureRegionDrawable trd = new TextureRegionDrawable(tr);
Image icon = new Image();
icon.setDrawable(trd);

これを考えると、OpenGLコンテキストが失われると(たとえば、画面がスリープ状態になるため)、テクスチャデータが失われるため、テクスチャデータをリロードする方法が必要です。

自分のマネージャークラスを作ってみました

DynamicTextureManager.register(t, pm); // Register texture together with the source pixmap

上記のスニペットに、そしてresume()私はします:

DynamicTextureManager.reload();

マネージャークラス:

public class DynamicTextureManager {
    private static LinkedHashMap<Texture, Pixmap> theMap = new
      LinkedHashMap<Texture,Pixmap>();
    public static void reload() {
        Set<Entry<Texture,Pixmap>> es = theMap.entrySet();
        for(Entry<Texture,Pixmap> e : es) {
            Texture t = e.getKey();
            Pixmap p = e.getValue();

            t.draw(p, 0, 0);
        }   
    }

    public static void register(Texture t, Pixmap p) {
        theMap.put(t, p);
    }
}

しかし、これは役に立ちません-私はまだテクスチャがアンロードされ、画像の代わりに白い領域ができてしまいます。

これはどのように行う必要がありますか?これを示すコードを見つけることができませんでした!

4

1 に答える 1

1

参照として私のソリューションを追加します。ここで、ImageオブジェクトとPixmapオブジェクトをマネージャーに登録します。reload()で、テクスチャがPixmapから再作成され、古いイメージに新しいテクスチャを設定します。私にとってはうまくいきますが、よりエレガントなソリューションを歓迎します。

import java.util.Map.Entry;
public class DynamicTextureManager {
    private static final class MapData {
        Pixmap pixmap;
        int width;
        int height;
    }

    private static WeakHashMap<Image, MapData> theMap = new WeakHashMap<Image, MapData>();

    public static void reload() {
        Set<Entry<Image, MapData>> es = theMap.entrySet();
        for (Entry<Image, MapData> e : es) {
            Image i = e.getKey();
            MapData d = e.getValue();

            Texture t = new Texture(d.pixmap);
            TextureRegion tr;
            if(d.width == -1 || d.height == -1) {
                tr = new TextureRegion(t);
            }
            else {
                tr = new TextureRegion(t,d.width, d.height);                
            }
            TextureRegionDrawable trd = new TextureRegionDrawable(tr);
            i.setDrawable(trd);
        }
    }

    public static void register(Image i, Pixmap p) {
        MapData d = new MapData();
        d.pixmap = p;
        d.width = -1;
        d.height = -1;
        theMap.put(i, d);
    }

    public static void register(Image i, Pixmap p, int width, int height) {
        MapData d = new MapData();
        d.pixmap = p;
        d.width = width;
        d.height = height;

        theMap.put(i, d);
    }

}
于 2013-03-11T09:25:45.830 に答える