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:
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:
GameActivity_showSoftInput()
sanal klavyeyi gösterir.GameActivity_hideSoftInput()
sanal klavyeyi gizler.
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:
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
- GameActivity'nin dahili
GameTextInput
örneğini almak içinGameActivity_getTextInput()
kullanın. GameTextInput
örneği elinizdeyken aynıGameTextInputState
içeriğini almak içinGameTextInput_getState()
'ı arayın.
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:
- GameActivity'yi kullanmaya başlama
- GameTextInput kullanıcı belgeleri
- agdkTunnel örneği
- GameActivity için Jetpack referans belgeleri
- GameTextInput için Jetpack referans belgeleri
- AGDK kaynak kodu
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.