Изменение вида кнопки Libgdx

Мне нужно изменить внешний вид Button Libgdx, когда запускаются некоторые из моих событий.

Вот объявление моей кнопки:

Button googleButton = new Button(skin.getDrawable("google_sign_in"));

Вот что я пробовал:

 googleButton.setBackground(skin.getDrawable("google_sign_out")); googleButton.invalidate(); googleButton.setChecked(true); googleButton.invalidate(); googleButton.getStyle().up = skin.getDrawable("google_sign_out"); googleButton.invalidate(); 

Я сделал много поисков, но я не могу найти ответ. Может ли кто-нибудь показать мне правильный способ сделать это?

Я думаю, проблема заключается в том, что вы меняете содержимое скина / стиля после инициализации Button , но объект кнопки не ссылается на стиль после его инициализации. Я также не совсем понимаю, что вы собираетесь делать. Я предполагаю, что вы хотите показать кнопку входа в систему, пока пользователь не войдет в систему, а затем вы хотите, чтобы эта кнопка была «выходила».

Метод invalidate просто запускает повторную компоновку (для пересчета размера / местоположения Actor ).

Возможно, попробуйте форсировать стиль с помощью setStyle , например:

  googleButton.getStyle().up = ... whatever; googleButton.setStyle(googleButton.getStyle()); 

Тем не менее, я думаю, вам будет лучше иметь два (?) Button объекта Button (один для входа в систему и один для выхода из системы). Упакуйте их в стек и просто сделайте одно или другое невидимым (см. Actor.setVisible )

Мне удалось заставить это работать. В моем Актере, кости, которые имеют 6 возможных изображений:

 public Dice(int options) { super(new Button.ButtonStyle()); } 

И когда я хочу изменить лицо:

 public void setValue(int value) { this.value = value; Button.ButtonStyle style = getStyle(); style.up = new TextureRegionDrawable( Assets.instance.dices.facesUp[value]); style.down = new TextureRegionDrawable( Assets.instance.dices.facesDown[value]); style.checked = new TextureRegionDrawable( Assets.instance.dices.facesChecked[value]); setSize(getPrefWidth(), getPrefHeight()); } 

Я думаю, что трюк в

 setSize(getPrefWidth(), getPrefHeight()); 

Если я опустил это, кости не отображаются. И нет необходимости в setStyle или invalidate ().

Вместо этого используйте класс CheckBox ;

1- сделать файл .json для кожи

 { com.badlogic.gdx.graphics.g2d.BitmapFont: { default-font: { file: fontfile.fnt } }, com.badlogic.gdx.graphics.Color: { green: { a: 1, b: 0, g: 1, r: 0 }, white: { a: 1, b: 1, g: 1, r: 1 }, red: { a: 1, b: 0, g: 0, r: 1 }, black: { a: 1, b: 0, g: 0, r: 0 } }, com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle: { google-loggin: { checkboxOn: google_sign_in, checkboxOff: google_sign_out, font: default-font, fontColor: white } }, } 

2- сделать кожу

 skin = new Skin(Gdx.files.internal("your.json-file.json"), new TextureAtlas("textureAtlas-file.pack")); 

3- создать кнопку, игнорирующую первый аргумент:

 CheckBox loginButton = new CheckBox("", skin, "google-loging"); 

Просто для тех, кто ищет это через Google. Чтобы изменить стиль кнопки из стиля, уже добавленного в ваш файл скина, после инициализации:

 btn.setStyle(skin.get("YOUR BTN STYLE",TextButton.TextButtonStyle.class)); 
Intereting Posts
Небольшое смещение при расчете вращения на основе точки касания Реагировать на локальные изображения с URI на Android Невозможно выбрать место с Android Place Picker Как очистить SurfaceTexture после использования с MediaPlayer? Модуль Gradle и подмодуль git Экран Android, показывающий ссылку на объект вместо строки Использование Glide для загрузки растрового изображения в ImageView Почему мой тост не появляется? Мое местоположение и маркер имеют разные местоположения В Espresso, как выбрать один вид, у которого одинаковый идентификатор, чтобы избежать исключения AmbiguousViewMatcherException Как построить проект Android с openjdk на Ubuntu? Добавить цвет "# e3bb87" в StateListDrawable программно Не удается полностью избавиться от цвета подсветки клавиш в приложении Phonegap 3.0 на Android 4.1.2 Могу ли я измерять расстояния со звуком в приложении Android? Установка z порядка просмотра с помощью bringChildToFront ()