GameActivity'de TextInput Android Game Development Kit'in bir parçasıdır.

GameActivity, GameTextInput'u aşağıdaki şekilde entegre eder:

  • sarmalayıcı
  • yeni metin girişi etkinliği kullanılabilirliği için işaret oluşturma
  • metin içeriği için GameTextInput’un durum arabelleğini kullanarak doğrudan

Aşağıdaki şemada gösterildiği gibi uygulamalar, kullanıcının metin girişi yapmak için farklı dahili mantıksal bileşenler kullanır:

alternatif metin

Yerleşik GameTextInput kitaplığını kullanmak için üç genel adım vardır:

  • Kullanıcı arayüzünde sanal klavyeyi kontrol etme
  • Yeni metin kullanıma sunulduğunda haberdar olma
  • Kullanıcı giriş metni ve durumları alınıyor

Bu belgenin geri kalanında bunlar ayrıntılı olarak açıklanmaktadır. GameActivity uygulamasının kullanıldığı bir GameTextInput örneği için oyun-örnekleri deposuna bakın.

Kullanıcı arayüzünde sanal klavyeyi kontrol et

GameActivity, kullanıcı arayüzündeki yazılım klavyesini kontrol etmek için iki işlev sağlar:

Tanımları için API referans belgelerine bakın. Klavye görüntülendikten sonra, uygulamanın kullanıcı arayüzü aşağıdakine benzer görünebilir:

alternatif metin

Metin kullanılabilirliğini kontrol edin

Soft klavye etkinlikleri, JNI üzerinden Java tarafında GameTextInput konumundan C/C++ tarafına aktarılır, ardından GameActivity’nin sarmalayıcısına gider ve son olarak native_app_glue öğesinde uygulanan android_app::textInputState işaretini yansıtır. Uygulamalar, amaçlanan işlemi gerçekleştirmek için bu işareti düzenli olarak yoklamalıdır:

  • GameActivity yalnızca android_app::textInputState işaretini ayarlar.
  • Uygulamalar, işareti yoklar ve giriş arabelleğine eklenen yeni metin gibi yeni GameTextInput etkinliklerini işler.
  • Uygulamalar android_app::textInputState öğesini temizler.

android_app::textInputState işlevinin tek ve çoklu metin girişi etkinliklerini birbirinden ayırt etmediğini unutmayın.

Basit bir örnek vermek gerekirse aşağıdaki kod, uygulama döngüsü komutlarını, dokunma etkinliklerini ve önemli etkinlikleri işledikten sonra textInputState işaretini yoklar:

while (true) {
   // Read all pending events.
   int events;
   struct android_poll_source* source;

   while ((ALooper_pollAll(engine.animating ? 0 : -1, nullptr, &events,
                                 (void**)&source)) >= 0) {
       // Process this event, etc.
       ...
       // Check if we are exiting.
       if (app->destroyRequested != 0) {
           engine_term_display(&engine);
           return;
       }
   }
   engine_handle_input(app);

   // Process text input events if there is any outstanding.
   if (app->textInputState) {
       // process TextInput events.
          ...
       //reset the textInputState flag
       app->textInputState = 0;
   }
   if (engine.animating) {
         // draw frames.
   }
}

Kullanıcı giriş metnini al

Giriş metinleri ve diğer durumlar GameTextInput’un GameTextInput::currentState_ dahili arabelleğinde toplanır. Uygulamalar, içeriklerini almak için aşağıdaki yöntemlerden birini kullanabilir:

  • GameActivity’nin sarmalayıcı API'si (önerilir)
  • GameTextInput API'si

GameActivity API ile TextInput durumu alma

Uygulamalar geçerli metin girişini tipik geri çağırma mekanizmasıyla alır:

  • Metin girişi etkinliklerini işlemek için GameTextInputGetStateCallback türünde bir geri çağırma işlevi uygulayın.
  • Bir veya daha fazla bekleyen etkinlik olduğunda GameActivity_getInputState() numaralı telefonu arayın.
  • Etkinlikler işlendikten sonra android_app::textInputState bölümünü temizleyin.

Önceki bölümdeki snippet'le devam ettiğimizde, aşağıdaki kod metin girişi arabelleğine bir referans alır, bunu işler (gösterilmez) ve etkinlik işaretini sıfırlar:

extern "C" void GameTextInputGetStateCB(void *ctx, const struct GameTextInputState *state) {
    auto* engine = (struct engine*)ctx;
    if (!engine || !state) return;

    // Process the text event(s).
    LOGI("UserInputText: %s", state->text_UTF8);

    // Clear the text input flag.
    engine->app->textInputState = 0;
}

Önceki bölümde gösterilen oyun döngüsünde, metni yukarıdaki metin girişi işleyici ile kontrol edin ve işleyin:

if (state->textInputState) {
    GameActivity_getTextInputState(
        app->activity,
        GameTextInputGetStateCB,  // App's event handler shown above.
        &engine // Context to the GameTextInputGetStateCB function.
    );
}

Uygulamalar isteğe bağlı olarak GameTextInputState içeriğini GameActivity_setTextInputState() ile başlatabilir.

GameTextInput API ile TextInput durumu alma

Uygulamalar, geçerli GameTextInputState öğesini almak için doğrudan GameTextInput API'yi de kullanabilir:

Uygulamaların GameTextInput öğesini doğrudan başlatmaması gerektiğini tekrar hatırlatmak isteriz. GameActivity bunu zaten başlatma işlemi sırasında yapar.

Geri çağırma mekanizması, GameActivity’nin GameActivity_getTextInputState() işlevi tarafından kullanılanla aynıdır.

Referanslar

Geliştiriciler GameActivity uygulamaları oluştururken aşağıdaki kaynaklardan yararlanabilir:

Geri bildirim

GameActivity ve GameTextInput, Jetpack oyun kitaplığının bir parçasıdır. Yaşadığınız sorunlar ve sorularınız için Google IssueTracker'da hata kaydı oluşturun.