jjzjj

java - libgdx:屏幕键盘上的 IOS 未持续触发事件

coder 2023-09-23 原文

我仅在 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!

在 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

我想我总能滚动自己的屏幕键盘...

最佳答案

只是想跟进,以防将来有人发现自己在这里。我最终创建了自己的屏幕键盘,我无法让这些事件在 iOS 中始终如一地工作。

如果以后有人有什么想补充的,我会签到接受答案。

关于java - libgdx:屏幕键盘上的 IOS 未持续触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44297831/

有关java - libgdx:屏幕键盘上的 IOS 未持续触发事件的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  3. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  4. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  5. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  6. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  7. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  8. ruby-on-rails - 如何在 Rails Controller Action 上触发 Facebook 像素 - 2

    我有一个ruby​​onrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

随机推荐