【问题标题】:LibGDX - change state of ImageButton without calling 'click' eventLibGDX - 在不调用“点击”事件的情况下更改 ImageButton 的状态
【发布时间】:2015-04-21 04:44:50
【问题描述】:

在LibGDX 我有ImageButton 带有点击事件。

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

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

selected = false;

问题是在将其状态从活动更改为非活动后,它还会像我“点击”它一样调用该事件,然后我再次进入checkIfOtherButtnsPressed()。

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

【问题讨论】:

    标签: android libgdx imagebutton


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      除此之外,您还可以使用 Image,它也是一种演员并采用可绘制对象,每当点击另一个演员时,您都可以更改您的 Image 可绘制。

      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() 的方法更改可绘制对象。

      【讨论】:

        【解决方案3】:

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

        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 演示中提取的 sn-p 将为您提供处理基于图形的事件的一个很好的起点。 link here 最好使用已实现 Android 当前库的 Libgdx 方法,因为 Android 具有与 Libgdx 类不兼容的各种方法,这会导致将来无法进行调试或应用程序崩溃。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-29
          • 2016-02-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-15
          • 1970-01-01
          • 1970-01-01
          • 2017-08-17
          相关资源
          最近更新 更多