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

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

  • sarmalayıcı sağlama
  • Yeni metin girişi etkinliği kullanılabilirliği için işaret oluşturma
  • Metin içeriği için doğrudan GameTextInput'in durum arabelleğini kullanma

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

alt_text

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

  • Kullanıcı arayüzünde sanal klavyeyi kontrol etme
  • Yeni metinler kullanıma sunulduğunda bildirim alma
  • Kullanıcı girişi metnini ve durumlarını alma

Bu belgenin geri kalanında bu özellikler ayrıntılı olarak açıklanmaktadır. GameTextInput ile GameActivity kullanımına dair bir örnek için games-samples deposuna bakın.

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

GameActivity, kullanıcı arayüzündeki sanal klavyeyi 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ğıdaki gibi görünebilir:

alt_text

Metinlerin kullanılabilirliğini kontrol etme

Yumuşak klavye etkinlikleri, Java tarafındaki GameTextInput öğesinden JNI aracılığıyla C/C++ tarafına aktarılır, ardından GameActivity'nin sarmalayıcısına kadar gider ve son olarak native_app_glue içinde uygulanan android_app::textInputState işaretinde yansıtılır. Uygulamalar, amaçlanan işlemeyi 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, tek ve birden fazla metin girişi etkinliği arasında ayrım yapmaz.

Basit bir örnek olarak, 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_pollOnce(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 alma

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

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

GameActivity API ile TextInput durumunu alma

Uygulamalar, geçerli metin girişini normal 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() işlevini çağırın.
  • Etkinlikler işlendikten sonra android_app::textInputState temizlenir.

Önceki bölümdeki snippet'e devam edersek 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, yukarıdaki metin girişi işleyicisiyle metni 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 durumunu alma

Uygulamalar, mevcut GameTextInput değerini almak için doğrudan GameTextInput API'sini de kullanabilir:GameTextInputState

Uygulamaların doğrudan GameTextInput başlatılmaması gerektiğini tekrar hatırlatırız. GameActivity, başlatma işlemi sırasında bunu zaten yapar.

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

Referanslar

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

Geri bildirim

GameActivity ve GameTextInput, Jetpack Games Kitaplığı'nın bir parçasıdır. Sorunlar ve sorular için Google IssueTracker'da hata kaydı oluşturun.