2017-06-01 43 views
6

我只在IOS构建中遇到InputProcessor问题。此代码适用于Desktop和Android版本,但不适用于iOS。libgdx:屏幕键盘上的IOS始终无法触发事件

基本上,我需要在用户键入屏幕键盘时随时捕捉事件。但是在iOS中,我只能看到我的printType为keyTyped,并且只能在屏幕快速键盘上输入。所有其他触摸只是在控制台中显示一个新行,我不确定这个新行输出源自哪里。

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

这是iOS的控制台输出看起来像这样当我键入速度非常快,如果我型缓中的println一直没有出现:

game name field key typed! 


game name field key typed! 






game name field key typed! 

做一个Android设备上同样的事情(的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

我想我总是可以推出自己的屏幕键盘...

回答

2

只是想跟进柜面任何人在这里找到自己在将来。我最终创建了我自己的屏幕键盘,我无法让事件在iOS中始终如一地工作。

如果任何人有任何他们想在未来添加我会检查接受答案。