5

我正在尝试使用九个补丁作为 Libgdx Scene2d UI 按钮的背景。它正在加载,但它真的很难看。我可以看到“元数据”像素,它被拉伸,就好像它只是一个普通图像(按钮上的文本是“继续”):

九个补丁按钮的丑陋图像

我通过 (libgdx ) 将.9.png文件直接加载到(libgdx) 中,如下所示:NinePatchDrawableNinePatch

this.dialogButtonUp = new NinePatchDrawable(
   new NinePatch(new Texture(Gdx.files.internal("data/button-round.9.png"))));
this.dialogButtonDown  = new NinePatchDrawable(
   new NinePatch(new Texture(Gdx.files.internal("data/button-round-down.9.png"))));

然后我做一个TextButtonStyle描述按钮的,并引用两个NinePatchdrawable:

TextButton.TextButtonStyle buttonStyle = new TextButton.TextButtonStyle();
buttonStyle.font =  aValidFontReally;
buttonStyle.fontColor = Color.BLACK;
buttonStyle.up = this.dialogButtonUp;
buttonStyle.down = this.dialogButtonDown;
buttonStyle.pressedOffsetX = -2;

我正在通过一个Dialog框间接构建按钮:

new Dialog( ... ).button("Continue", null, buttonStyle);

我检查了.9.png文件以确保:

  • 资产文件已在 Eclipse 中刷新
  • 元数据边界像素是完全不可见或完全可见的黑色
  • Androiddraw9patch工具可以加载图像并验证它们

关于检查或更改什么的任何其他建议?

4

1 回答 1

11

感谢来自@RodHyde 的一些指针,看起来libgdxNinePatch类被设计为接受“后处理”九个补丁纹理(即,具有描述如何将单个纹理切割成补丁的单独整数值)。这种“处理”通常是作为将“.9.png”文件打包到文件中的副作用发生的TextureAtlas(参见https://github.com/libgdx/libgdx/wiki/Texture-packer#ninePatches)。纹理图集是一个非常好的主意(尤其是当您的 UI 包含一堆不同的纹理元素时),所以这是有道理的,但在开发和尝试运行某些东西时有点令人惊讶。

为了解决这个问题,我可以直接包含我写的“.9.png”文件:

private static NinePatch processNinePatchFile(String fname) {
    final Texture t = new Texture(Gdx.files.internal(fname));
    final int width = t.getWidth() - 2;
    final int height = t.getHeight() - 2;
    return new NinePatch(new TextureRegion(t, 1, 1, width, height), 3, 3, 3, 3);
}

这会加载纹理,创建一个修剪掉 1 像素元数据边框的子区域,然后猜测九个补丁边框元素是 3 像素宽/高。(通过混淆纹理数据来正确计算似乎是可能的,但不值得付出努力——在这种情况下,只需将纹理放入图集中即可。)

于 2013-03-12T21:14:52.810 回答