LibGDX - изменить состояние ImageButton без вызова события click

В LibGDX я имею ImageButton с событием для нажатия.

myBtn.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            checkIfOtherButtnsPressed()
        }
    });

У меня есть несколько кнопок и что я делаю в checkIfOtherButtnsPressed() проверяет состояние других кнопок, если кнопка была нажата, а другая находится в активном состоянии, я изменяю ее состояние на

selected = false;

проблема в том, что после изменения его состояния с активного на неактивное, оно также вызывает событие, как будто я "кликнул" по нему, и я попадаю в checkIfOtherButtnsPressed() снова.

Могу ли я изменить состояние кнопки, не отправляя событие click, или узнать, из какой ситуации был щелчок?

3 ответа

Решение

Я не знаю правильных имен методов для libgdx, но простая логика заключается в том, что вы должны удалить прослушиватель при изменении состояния и снова установить прослушиватель после изменения состояния.

myBtn.addListener(null);
myBtn.setSelected([true|false]);
myBtn.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            checkIfOtherButtnsPressed()
        }
    });

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

Image imgBtn=new Image(drawableNonFocus);
imgBtn.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            // TODO Auto-generated method stub
            changeIfOtherButtonPressed();
        }
    });


    private void changeIfOtherButtonPressed()
    {
        imgBtn.setDrawable(drawableFocus);
    }

Вы можете изменить рисование, как показано в приведенном выше методе с именем changeIfOtherButtonPressed ().

Я бы предложил использовать функции Libgdx на Android. Libgdx предлагает способ обойти физический аспект приложений. Во-первых, вы захотите создать спрайт и загрузить его в свой onCreate() метод любого класса, который @ overrides вашего основного класса, который расширяет Libgdx Game учебный класс. Это загрузит спрайт, готовый к вызову в ваш renderer() Затем вам нужно будет назначить spritebatch для вашего средства визуализации и вызвать метод отрисовки из этого для назначенных координат.

SpriteBatch batcher;
Batcher.draw(x, y, width, height) Documentation for [drawing][1]

Затем назначьте граничный прямоугольник кнопке. Ваш слушатель будет запущен, когда пользователь коснется определенной точки на экране, соответствующей положению вашей кнопки.

if (Gdx.input.justTouched()) {
    guiCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
            if (pauseBounds.contains(touchPoint.x, touchPoint.y)) {
                SoundHandler.playSound(SoundHandler.clickSound);
                state = ConstantsHandler.GAME_PAUSED;
                return;
            }
        }

Фрагмент, взятый из демонстрации SuperJumper, предоставленной Libgdx, даст вам отличную отправную точку для работы с событиями на основе графики. Ссылка здесь всегда лучше использовать методы Libgdx, которые реализовали текущие библиотеки Android, потому что Android имеет различные методы, которые не совместимы с классами Libgdx, что приводит к непредвиденной отладке или сбоям приложения в будущем.

Это не решение вашей текущей проблемы, а альтернативный способ решения будущих проблем.

Другие вопросы по тегам