2013-03-12 3 views
4

Я пытаюсь использовать Nine Patch в качестве фона для кнопки интерфейса Libgdx Scene2d. Это загрузка, но это действительно уродливо. Я могу видеть «мета-данных» пикселей, а его растягиваются, как будто это просто обычный образ (текст на кнопке «Продолжить»):Загрузка изображения с девятью патчами в виде фона Libgdx Scene2d выглядит ужасно

ugly image of a nine-patch button

Я загрузки .9.png файлы непосредственно в (libgdx) NinePatchDrawable через (libgdx) NinePatch так:

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, который описывает кнопку, а также ссылки на два NinePatch: вводимого коэффициента

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
  • что пиксели границы метаданных либо полностью невидимы, либо полностью видимы-черные
  • , что Android draw9patch инструмент может загрузить изображения и подтвердить их.

Любые другие предложения по проверке или изменению?

+0

Попробуйте выполнить каждый NinePatch с помощью SpriteBatch с помощью NinePatch.draw() как который будет по крайней мере изолировать, где проблема, т. е. если она работает, то проблема не в NinePatch. –

+0

Хороший вопрос! Я просто попробовал это, а также вижу ту же уродливость с помощью прямого 'NinePatch.draw (...)'. Таким образом, 'Dialog' и' Button' не подрывают его. –

+2

Глядя на источник NinePatch (https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g2d/NinePatch.java), я не думаю, что он много делает, если вы используете конструктор, который принимает один параметр Texture. Вместо этого попробуйте этот конструктор: public NinePatch (текстурная текстура, int left, int right, int top, int bottom) –

ответ

10

Благодаря некоторым указателям от @RodHyde, класс libgdx NinePatch предназначен для приема «пост-обработанной» девяти текстур патча (т. Е. С отдельными целыми значениями, которые описывают, как разрезать одну текстуру на патчи) , Эта «обработка» обычно происходит как побочный эффект упаковки файла «.9.png» в TextureAtlas (см. https://github.com/libgdx/libgdx/wiki/Texture-packer#ninePatches). Атлас текстуры - действительно хорошая идея (особенно, когда ваш пользовательский интерфейс включает в себя множество различных элементов текстуры), поэтому это имеет смысл, но немного удивительно, когда вы разрабатываете и пытаетесь что-то запустить.

Для работы вокруг этого, так что я могу непосредственно включать «.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-пиксельной меты -data border, а затем просто догадывается, что пограничные элементы с девятью патчами имеют 3 пиксела в ширину/высоту. (Вычислить это правильно, щелкая в данных текстуры, кажется возможным, но не стоит усилий - просто поместите текстуру в атлас в этом случае.)

+2

NinePatch javadoc улучшился, чтобы сделать это понятным: https://github.com/libgdx/libgdx/commit/5ce8dc04153234c760b3753fe3a6b4e6fe1653ea#gdx/src/ ком/badlogic/GDX/графика/g2d/NinePatch.java –

Смежные вопросы