LibGDX - 在不调用 'click' 事件的情况下更改 ImageButton 的状态

LibGDX - change state of ImageButton without calling 'click' event

LibGDX 我有 ImageButton 带有点击事件。

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

我有一些按钮,我在 checkIfOtherButtnsPressed() 中所做的是检查其他按钮的状态,如果一个按钮被按下并且另一个按钮也处于活动状态,我将其状态更改为

selected = false;

问题是在将其状态从活动状态更改为非活动状态后,它也像我 'cliked' 一样调用事件,然后我再次进入 checkIfOtherButtnsPressed()

我可以在不发送点击事件的情况下更改按钮状态吗,或者我可以从什么情况下识别 'click'?

我不知道 libgdx 的正确方法名称,但简单的逻辑是您应该在更改状态时删除侦听器并在状态更改后重新设置侦听器。

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

除此之外,您还可以使用 Image 这也是一种类型的演员,并采用可绘制对象,每当点击另一个演员时,您就可以更改 Image drawable.

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);
    }

您可以更改 drawable,如上面名为 changeIfOtherButtonPressed().

的方法所示

我建议在 Android 上使用 Libgdx 功能。 Libgdx 提供了绕过应用程序物理按钮方面的方法。 首先,您将要制作一个精灵并将其加载到任何 class 的 onCreate() 方法中,@overrides 您的主要 class 扩展了 Libgdx Game class。这会将准备好调用的 sprite 加载到您的 renderer() 方法中,然后您需要将一个 spritebatch 分配给您的渲染器,并从该渲染器调用一个 draw 方法到指定的坐标。

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;
            }
        }

摘自 Libgdx 提供的 SuperJumper 演示的片段将为您提供处理基于图形的事件的良好起点。 link here 最好使用已实现 Android 当前库的 Libgdx 方法,因为 Android 有各种与 Libgdx 不兼容的方法 classes,这会导致将来出现意外调试或应用程序崩溃。

这不是您当前问题的解决方案,而是帮助解决未来问题的替代途径。