Libgdx e文件,最终skin参数){ //加载atlas并创建蒙皮 最后一个字符串textureAtlasPath=file.pathWithoutExtension()+“.atlas”; 最终TextureAtlas atlas=manager.get(tex

Libgdx e文件,最终skin参数){ //加载atlas并创建蒙皮 最后一个字符串textureAtlasPath=file.pathWithoutExtension()+“.atlas”; 最终TextureAtlas atlas=manager.get(tex,libgdx,dependencies,assets,dispose,skin,Libgdx,Dependencies,Assets,Dispose,Skin,e文件,最终skin参数){ //加载atlas并创建蒙皮 最后一个字符串textureAtlasPath=file.pathWithoutExtension()+“.atlas”; 最终TextureAtlas atlas=manager.get(textureAtlasPath,TextureAtlas.class); 最终皮肤=新皮肤(阿特拉斯); //将位图字体添加到皮肤 for(int-fontSize:parameter.fontSizesToCreate){ skin.add(“f

e文件,最终skin参数){ //加载atlas并创建蒙皮 最后一个字符串textureAtlasPath=file.pathWithoutExtension()+“.atlas”; 最终TextureAtlas atlas=manager.get(textureAtlasPath,TextureAtlas.class); 最终皮肤=新皮肤(阿特拉斯); //将位图字体添加到皮肤 for(int-fontSize:parameter.fontSizesToCreate){ skin.add(“font_”+fontSize,manager.get(“font”+fontSize+“.ttf”)); } //现在加载皮肤,因为json文件中的字体现在可用 skin.load(文件); 返回皮肤; } @凌驾 public void loadAsync(最终AssetManager管理器、最终字符串文件名、最终文件句柄文件、最终SkinParameter参数){ }} 公共类皮肤扩展com.badlogic.gdx.scenes.scene2d.ui.Skin{ 皮肤(最终纹理图谱){ 超级(阿特拉斯); } @凌驾 公共空间处置(){ 对于(字符串bitmapFontKey:this.getAll(BitmapFont.class).keys()){ 删除(bitmapFontKey,BitmapFont.class); } super.dispose(); }}
非常优雅的解决方案。谢谢分享!
public class Test extends Game {
  private AssetManager assetManager;
  private Skin skin;
  private Batch batch;

  @Override
  public void create() {
    this.assetManager = new AssetManager();
    final FileHandleResolver resolver = new InternalFileHandleResolver();
    assetManager.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
    assetManager.setLoader(BitmapFont.class, ".ttf", new FreetypeFontLoader(resolver));

    final ObjectMap<String, Object> resources = new ObjectMap<String, Object>();
    final FreetypeFontLoader.FreeTypeFontLoaderParameter fontParam = new FreetypeFontLoader.FreeTypeFontLoaderParameter();
    fontParam.fontFileName = "ui/font.ttf";
    fontParam.fontParameters.size = (int) (16 * Gdx.graphics.getDensity());
    assetManager.load("font16.ttf", BitmapFont.class, fontParam);
    assetManager.finishLoading();
    resources.put("font_16", assetManager.get("font16.ttf", BitmapFont.class));

    assetManager.load("ui/ui.json", Skin.class, new SkinLoader.SkinParameter(resources));
    assetManager.finishLoading();
    skin = assetManager.get("ui/ui.json", Skin.class);

    batch = new SpriteBatch();
  }

  @Override
  public void render() {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    batch.begin();
    skin.get("font_16", BitmapFont.class).draw(batch, "Test123", 10, 10);
    batch.end();
  }

  @Override
  public void dispose() {
    super.dispose();
    // enabling the next line will get rid of the Pixmap already disposed exception
    // skin.remove("font_16", BitmapFont.class);
    assetManager.dispose();
    batch.dispose();
  }
}
public void dispose () {
    if (atlas != null) atlas.dispose();
    for (ObjectMap<String, Object> entry : resources.values()) {
        for (Object resource : entry.values())
            if (resource instanceof Disposable) ((Disposable)resource).dispose();
    }
}
public class SkinLoader extends AsynchronousAssetLoader<Skin, SkinLoader.SkinParameter> {
public static class SkinParameter extends AssetLoaderParameters<Skin> {
    private final String fontPath;
    private final int[] fontSizesToCreate;

    public SkinParameter(final String fontPath, final int... fontSizesToCreate) {
        if (fontPath == null || fontPath.trim().isEmpty()) {
            throw new GdxRuntimeException("fontPath cannot be null or empty");
        }
        if (fontSizesToCreate.length == 0) {
            throw new GdxRuntimeException("fontSizesToCreate has to contain at least one value");
        }

        this.fontPath = fontPath;
        this.fontSizesToCreate = fontSizesToCreate;
    }
}

public SkinLoader(final FileHandleResolver resolver) {
    super(resolver);
}

@Override
@SuppressWarnings("unchecked")
public Array<AssetDescriptor> getDependencies(final String fileName, final FileHandle file, final SkinParameter parameter) {
    if (parameter == null) {
        throw new GdxRuntimeException("SkinParameter cannot be null");
    }

    // texture atlas dependency
    final Array<AssetDescriptor> dependencies = new Array<AssetDescriptor>();
    dependencies.add(new AssetDescriptor(file.pathWithoutExtension() + ".atlas", TextureAtlas.class));

    // bitmap font dependencies
    for (int fontSize : parameter.fontSizesToCreate) {
        final FreetypeFontLoader.FreeTypeFontLoaderParameter fontParam = new FreetypeFontLoader.FreeTypeFontLoaderParameter();
        fontParam.fontFileName = parameter.fontPath;
        // enable anti-aliasing
        fontParam.fontParameters.minFilter = Texture.TextureFilter.Linear;
        fontParam.fontParameters.magFilter = Texture.TextureFilter.Linear;
        // create font according to density of target device display
        fontParam.fontParameters.size = (int) (fontSize * Gdx.graphics.getDensity());
        dependencies.add(new AssetDescriptor("font" + fontSize + ".ttf", BitmapFont.class, fontParam));
    }

    return dependencies;
}

@Override
public Skin loadSync(final AssetManager manager, final String fileName, final FileHandle file, final SkinParameter parameter) {
    // load atlas and create skin
    final String textureAtlasPath = file.pathWithoutExtension() + ".atlas";
    final TextureAtlas atlas = manager.get(textureAtlasPath, TextureAtlas.class);
    final Skin skin = new Skin(atlas);

    // add bitmap fonts to skin
    for (int fontSize : parameter.fontSizesToCreate) {
        skin.add("font_" + fontSize, manager.get("font" + fontSize + ".ttf"));
    }

    // load skin now because the fonts in the json file are now available
    skin.load(file);
    return skin;
}

@Override
public void loadAsync(final AssetManager manager, final String fileName, final FileHandle file, final SkinParameter parameter) {

}}

public class Skin extends com.badlogic.gdx.scenes.scene2d.ui.Skin {
Skin(final TextureAtlas atlas) {
    super(atlas);
}

@Override
public void dispose() {
    for (String bitmapFontKey : this.getAll(BitmapFont.class).keys()) {
        remove(bitmapFontKey, BitmapFont.class);
    }
    super.dispose();
}}