libgdx:IOS屏幕键盘不一致地触发事件

6

我在IOS构建中只有InputProcessor出现问题。这段代码适用于桌面和Android构建,但不适用于iOS。

基本上,我需要捕捉用户在屏幕键盘上输入时的任何事件。但在iOS中,我只在快速输入屏幕键盘时偶尔看到我的keyTyped的println输出。所有其他触摸都只在控制台中显示一个新行,我不确定这个新行输出来自哪里。

问题似乎源于iOS如何将事件发送回我的应用程序以及LibGDX InputProcessor如何接收它们。我尝试创建一个扩展TextField并实现InputProcessor的自己的对象,然后将该对象的实例设置为inputProcessor,但结果相同。如果我触摸屏幕上除iOS屏幕键盘之外的任何地方,我会得到一致的事件触发。

这是当我快速输入时iOS控制台输出的样子,如果我输入慢,println永远不会出现:

game name field key typed!


game name field key typed!






game name field key typed!

在安卓设备(Nexus 7)上执行相同的操作会得到以下结果(这也是我所期望的):

I/System.out: game name field key down!
I/System.out: game name field key up!
I/System.out: game name field key typed!
I/System.out: game name field key down!
I/System.out: game name field key up!
I/System.out: game name field key typed!
I/System.out: game name field key down!
I/System.out: game name field key up!
I/System.out: game name field key typed!

这是我的代码:

public class AccountScreen implements Screen {


final PieTherapy game;
private Stage stage;

private TextField gameNameField;

public AccountScreen(final PieTherapy game) {
    this.game = game;
    initialize();
}

private void initialize() {

    Viewport vp = new StretchViewport(PieTherapy.WORLD_WIDTH, PieTherapy.WORLD_HEIGHT, game.cam);
    stage = new Stage(vp);

    Gdx.input.setInputProcessor(stage);

    TextField.TextFieldStyle tfs = new TextField.TextFieldStyle();
    tfs.font = game.fontTitle;
    tfs.fontColor = Color.WHITE;
    tfs.background = new TextureRegionDrawable(new TextureRegion(game.assets.get("menus/textline.png", Texture.class)));
    tfs.focusedBackground = new TextureRegionDrawable(new TextureRegion(game.assets.get("menus/textline-selected.png", Texture.class)));
    tfs.cursor = new TextureRegionDrawable(new TextureRegion(game.assets.get("menus/cursor.png", Texture.class)));

    gameNameField = new TextField("", tfs);
    gameNameField.setWidth(PieTherapy.WORLD_WIDTH * .80f);
    gameNameField.setFocusTraversal(true);
    gameNameField.setPosition(PieTherapy.WORLD_WIDTH *.05f, game.WORLD_HEIGHT * .68f);
    // see if the player information has already been entered (edit mode)
    gameNameField.setText(game.primaryPlayer.gameName);
    gameNameField.addListener(new InputListener(){
        @Override
        public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
            System.out.println("game name field touch up!");
        }
        @Override
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
            System.out.println("game name field touch down!");
            return true;
        }

        @Override
        public boolean keyDown(InputEvent event, int keycode) {
            System.out.println("game name field key down!");
            return super.keyDown(event, keycode);
        }

        @Override
        public boolean keyUp(InputEvent event, int keycode) {
            System.out.println("game name field key up!");
            return super.keyUp(event, keycode);
        }

        @Override
        public boolean keyTyped(InputEvent event, char character) {
            System.out.println("game name field key typed!");
            return super.keyTyped(event, character);
        }
    });

    gameNameField.getOnscreenKeyboard().show(true);
    gameNameField.setCursorPosition(gameNameField.getText().length());

    stage.addActor(gameNameField);

    stage.setKeyboardFocus(gameNameField);
}

@Override
public void show() {

}

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0, 0, 0f, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    game.batch.begin();
    game.font.draw(game.batch, "Your name in the game! You can stick with the\nautomatically generated" +
                    "one or change to your own.\n Red: name is not available, " +
                    "green: available.",
            PieTherapy.WORLD_WIDTH *.36f,
            PieTherapy.WORLD_HEIGHT *.93f);

    game.batch.end();

    update(delta);
}

private void update(float delta) {

    stage.act(delta);

    stage.draw();

    game.batch.begin();

    game.batch.end();

}

@Override
public void resize(int width, int height) {

}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {

}
}

LibGDX版本:1.9.6 RoboVM(MobiDevelop)版本:2.3.1

我想我总是可以自己制作屏幕键盘......

1个回答

2

如果有人在未来遇到类似问题,我想跟进一下。最终我创建了自己的屏幕键盘,因为我无法在iOS上始终使事件正常工作。

如果有人以后有什么要补充的话,我会回来接受答案。


我在使用iOS模拟器的键盘时遇到了一些问题,但在实际设备上,至少是我自己拥有的iPhone 7上,它运行良好。不过,我还需要进行一些调试工作。我来这里是为了找到一些能解释模拟器问题的东西。 - undefined
JFTR,我在模拟器上发现的情况是,无论我按下哪个键,我都会收到两个keyType事件,而不是只有一个,第二个事件总是带有字符\u0008,这恰好是退格/删除键,所以问题在于我输入的每个字符都会自动删除。还在努力弄清楚原因…… - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接