Libgdx中如何在ClickListener中触发keyDown()或keyUp()方法
我编写了一个测试Button的Demo,但遇到问题:ClickListener中的keyDown()和keyUp()方法无法触发,不过该监听器的其他方法(如touchDown、clicked)可正常工作。
我创建Button并将其加入Stage,将Stage设置为InputProcessor,给Button添加自定义的MyButtonClickListener,但按下按键时,keyDown和keyUp方法并未执行。
代码示例
ButtonScreen.java
public class ButtonScreen implements Screen { public OrthographicCamera camera; public Stage stage; public ButtonScreen() { camera = new OrthographicCamera(); Viewport viewport = new ScreenViewport(camera); stage = new Stage(viewport); //add stage to Inputprocessor Gdx.input.setInputProcessor(stage); //make button Button button = new Button(new TextureRegionDrawable(ImgConsUtil.timeFileAtlas.findRegion(CardConstant.DO)), new TextureRegionDrawable(ImgConsUtil.timeFileAtlas.findRegion(CardConstant.ONE_TIME))); button.setPosition(200,200); button.addListener(new MyButtonClickListener()); //add button to stage stage.addActor(button); } @Override public void render(float delta) { camera.update(); PreparClass.batch.setProjectionMatrix(camera.combined); stage.act(); stage.draw(); } }
MyButtonClickListener.java
public class MyButtonClickListener extends ClickListener{ @Override public boolean keyDown (InputEvent event, int keycode) { System.out.println("keyDown"); return true; } @Override public boolean keyUp (InputEvent event, int keycode) { System.out.println("keyUp"); return true; } @Override public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { System.out.println("touchdown"); return false; } public void clicked(InputEvent inputEvent, float x,float y){ System.out.println("clicked"); } }
原因分析
- 焦点限制:LibGDX中,
ClickListener的键盘事件方法(keyDown/keyUp)仅在**对应的Actor获得输入焦点(focus)**时才会被触发,默认情况下Button不具备焦点,也不会自动获取焦点。 - 事件消费问题:你的
touchDown方法返回了false,这表示未消费该触摸事件,导致Button无法进入正常的交互状态,也无法在点击后自动获取焦点。
解决方法
步骤1:让Button支持焦点
在创建Button后,开启它的可聚焦属性:
button.setFocusable(true);
步骤2:修正touchDown方法的返回值
修改MyButtonClickListener中的touchDown方法,返回true以消费触摸事件,让Button能处理后续的状态变更(包括焦点获取):
@Override public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { System.out.println("touchdown"); return true; // 返回true,允许Button处理事件并更新状态 }
步骤3:手动设置焦点(可选)
如果希望Button在创建后立即接收键盘事件,可手动请求焦点:
button.requestFocus();
修改后的Button创建代码片段:
Button button = new Button(new TextureRegionDrawable(ImgConsUtil.timeFileAtlas.findRegion(CardConstant.DO)), new TextureRegionDrawable(ImgConsUtil.timeFileAtlas.findRegion(CardConstant.ONE_TIME))); button.setPosition(200,200); button.setFocusable(true); button.requestFocus(); // 初始就获取焦点 button.addListener(new MyButtonClickListener());
内容的提问来源于stack exchange,提问作者ashes
相关产品推荐
相关产品推荐

