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

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

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

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

alternatif_metin

Yerleşik GameTextInput kitaplığını kullanmanın üç 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ş metnini ve durumlarını alma

Bu belgenin geri kalanında bunlar ayrıntılı olarak açıklanmaktadır. GameActivity uygulamasının kullanıldığı GameTextInput örneğini görmek için games-samples deposuna göz atın.

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

GameActivity, kullanıcı arayüzünde klavye klavyesini kontrol etmek için iki işlev sağlar:

Tanımlarını öğrenmek 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:

alternatif_metin

Metin kullanılabilirliğini kontrol edin

Elektronik klavye etkinlikleri, Java tarafındaki GameTextInput noktasından JNI üzerinden 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, istenen 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, bayrağı yoklar ve yeni GameTextInput etkinliklerini (ör. giriş arabelleğine eklenen yeni metin) işler.
  • Uygulamalar android_app::textInputState öğesini temizler.

android_app::textInputState işlevinin tek ve çoklu metin giriş 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 dahili arabelleğinde (GameTextInput::currentState_) toplanır. Uygulamalar, içeriklerini almak için aşağıdaki yöntemlerden birini kullanabilir:

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

GameActivity API ile TextInput durumu alma

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

  • Metin giriş 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 etiketini temizleyin.

Önceki bölümdeki snippet ile devam edelim. Aşağıdaki kod, metin girişi arabelleğine bir referans alır, bunu işler (gösterilmemiştir) 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şleyicisiyle 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 dosyasını almak için doğrudan GameTextInput API'yi de kullanabilir:

Aynı şekilde, uygulamaların GameTextInput uygulamasını doğrudan başlatmaması gerektiğini unutmayın. GameActivity bunu başlatma işlemi sırasında zaten 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 sorun ve sorularınız için Google IssueTracker'da hata oluşturun.