Android LibGDX-在不调用“单击”事件的情况下更改ImageButton的状态
在LibGDX中,我有一个带有单击事件的ImageButtonAndroid LibGDX-在不调用“单击”事件的情况下更改ImageButton的状态,android,libgdx,imagebutton,Android,Libgdx,Imagebutton,在LibGDX中,我有一个带有单击事件的ImageButton myBtn.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { checkIfOtherButtnsPressed() } }); 我有一些按钮,我在CheckIfOtherButtonSpressed中所做
myBtn.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
checkIfOtherButtnsPressed()
}
});
我有一些按钮,我在CheckIfOtherButtonSpressed中所做的是检查其他按钮的状态,如果一个按钮被按下,而另一个按钮也处于活动状态,我会将其状态更改为
selected = false;
问题是在将其状态从active更改为not active之后,它也会调用事件,就像我在它上“Clike”一样,然后我再次进入CheckIfOtherButtonSpress
我可以在不解除单击事件的情况下更改按钮状态吗?或者我可以从什么情况下识别“单击”吗?我不知道libgdx的正确方法名称,但简单的逻辑是,在更改状态时应该删除侦听器,并在更改状态后再次设置侦听器
myBtn.addListener(null);
myBtn.setSelected([true|false]);
myBtn.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
checkIfOtherButtnsPressed()
}
});
除此之外,您还可以使用一个图像,这也是一种演员类型,并采取可绘制的,每当其他演员点击时,您可以更改您的图像可绘制
您可以按照上面名为changeIfOtherButtonPressed的方法更改drawable。我建议在Android上使用Libgdx功能。Libgdx提供了绕过应用程序的物理按钮方面的方法。 首先,您需要创建一个sprite并将其加载到任何类的onCreate方法中,该类@override会覆盖扩展Libgdx游戏类的主类。这将加载sprite,准备将其调用到渲染器方法中,然后需要为渲染器指定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演示中获取的一个片段将为您提供处理基于图形的事件的良好起点。使用实现了Android当前库的Libgdx方法总是更好的,因为Android有各种方法与Libgdx类不兼容,这会导致不必要的调试或将来应用程序崩溃
这不是解决当前问题的方法,而是帮助解决未来问题的另一种方法
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;
}
}