GameTextInput Android Oyun Geliştirme Kiti'nin bir parçasıdır.
GameTextInput
kitaplığını kullanmak, metin girişi için yazılım klavyesini kullanan tam ekran bir Android uygulaması yazmaya kıyasla daha basit bir alternatiftir.
GameTextInput
, klavyeyi göstermek veya gizlemek, düzenlenmiş metni ayarlamak veya almak ve metin değiştirildiğinde bildirim almak için basit bir API sunar. Bu, tam kapsamlı metin düzenleyici uygulamaları için tasarlanmamıştır ancak yine de oyunların tipik kullanım alanları için bölge seçme ve oluşturma desteği sağlar. Ayrıca bu kitaplık yazım denetimi, tamamlamalar ve çok tuşlu karakterler gibi gelişmiş giriş yöntemi düzenleyici (IME) özelliklerini de destekler.
GameTextInput
, giriş metnini dahili arabelleğe GameTextInput::currentState_
ekleyerek (ilgili durumlarla birlikte) dahili arabelleğe alır ve içindeki değişiklikler konusunda uygulamaya bildirim gönderir. Ardından uygulama, kayıtlı geri çağırma işlevinde metin işlemeyi gerçekleştirir.
Kullanılabilirlik
GameTextInput
, aşağıdaki şekillerde kullanılabilir:
GameActivity ile birlikte: GameActivity, GameTextInput'u entegre ediyor. GameActivity kullanan uygulamalar yalnızca entegre GameTextInput kullanabilir. Kullanım talimatları GameActivity sayfasında eksiksiz olarak belgelenmiştir. GameActivity ve GameTextInput entegrasyonu örneği için games-samples deposuna bakın. Bu kullanım modeli, bu kılavuzun kapsamında değildir.
Bağımsız bir kitaplık olarak: Kılavuzun geri kalanında kullanım adımları açıklanmaktadır.
Yukarıdaki iki yöntemin karşılıklı olarak birbirini dışladığını unutmayın.
Resmi GameTextInput
sürümleri aşağıdaki kanallarda mevcuttur:
- Jetpack oyun kitaplığı Google Maven'da kullanıma sunuldu
- Zip dosyası AGDK indirme sayfasından serbest bırakılır
Bu kılavuz ilk kullanım alanını kapsar. ZIP dosya sürümlerini kullanmak için paketin içinde gönderilen talimatlara bakın.
Derlemenizi ayarlama
GameTextInput
, Android Arşivi (AAR) olarak dağıtılır. Bu AAR, Java sınıflarını ve GameTextInput
yerel özelliklerini uygulayan C kaynak kodunu içerir. Bu kaynak dosyaları, yerel kitaplıkları ve kaynak kodunu CMake projenize veya NDK derlemenize sunan Prefab
aracılığıyla derleme sürecinize eklemeniz gerekir.
GameTextInput
kitaplığı bağımlılığını oyununuzunbuild.gradle
dosyasına eklemek için Jetpack Android Games sayfasındaki talimatları uygulayın. Uygulamalarınız GameActivity kullanıyorsa bağımsızGameTextInput
kitaplığını kullanamayacağını unutmayın.gradle.properties
aşağıdaki satırları içerdiğinden emin olun:# Tell Android Studio we are using AndroidX. android.useAndroidX=true # Use Prefab 1.1.2 or higher, which contains a fix for "header only" libs. android.prefabVersion=1.1.2 # Required only if you're using Android Studio 4.0 (4.1 is recommended). # android.enablePrefab=true
game-text-input
paketini içe aktarın ve projenizinCMakeLists.txt
dosyasındaki hedefinize ekleyin:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)
Oyununuzdaki
.cpp
dosyalarından birine,GameTextInput
uygulamasını eklemek için aşağıdaki satırı ekleyin:#include <game-text-input/gametextinput.cpp>
GameTextInput
C API'yi kullanan kaynak dosyalara başlık dosyasını ekleyin:#include <game-text-input/gametextinput.h>
Uygulamayı derleyip çalıştırın. CMake hatalarınız varsa AAR'nin ve
build.gradle
dosyalarının düzgün şekilde ayarlandığını doğrulayın.#include
dosyası bulunamazsaCMakeLists.txt
yapılandırma dosyanızı doğrulayın.
Yapınızı entegre edin
JVM'ye veya uygulama ana iş parçacığına zaten eklenmiş olan C ileti parçanızdan
JNIEnv
işaretçisiyleGameTextInput_init
çağrısı yapın.static GameTextInput* gameTextInput = nullptr; extern "C" JNIEXPORT void JNICALL Java_com_gametextinput_testbed_MainActivity_onCreated(JNIEnv* env, jobject this) { { if(!gameTextInput) gameTextInput = GameTextInput_init(env); ... }
InputConnection
erişimi olan birInputEnabledTextView
Java sınıfı oluşturun.public class InputEnabledTextView extends View implements Listener { public InputConnection mInputConnection; public InputEnabledTextView(Context context, AttributeSet attrs) { super(context, attrs); } public InputEnabledTextView(Context context) { super(context); } public void createInputConnection(int inputType) { EditorInfo editorInfo = new EditorInfo(); editorInfo.inputType = inputType; editorInfo.actionId = IME_ACTION_NONE; editorInfo.imeOptions = IME_FLAG_NO_FULLSCREEN; mInputConnection = new InputConnection(this.getContext(), this, new Settings(editorInfo, true) ).setListener(this); } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { if (outAttrs != null) { GameTextInput.copyEditorInfo(mInputConnection.getEditorInfo(), outAttrs); } return mInputConnection; } // Called when the IME input changes. @Override public void stateChanged(State newState, boolean dismissed) { onTextInputEventNative(newState); } @Override public void onImeInsetsChanged(Insets insets) { // handle Inset changes here } private native void onTextInputEventNative(State softKeyboardEvent); }
Oluşturulan
InputEnabledTextView
öğesini kullanıcı arayüzü düzenine ekleyin. Örneğin,activity_main.xml
içinde aşağıdaki kod bunu ekranın en altına yerleştirebilir:<com.android.example.gametextinputjava.InputEnabledTextView android:id="@+id/input_enabled_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" />
Bu yeni
InputEnabledTextView
sınıfını Java etkinliğinize alın. Görünüm Bağlama'yı kullandığınızda bu işlem görece basittir:public class MainActivity extends AppCompatActivity { ... private ActivityMainBinding binding; private InputEnabledTextView inputEnabledTextView; private native void setInputConnectionNative(InputConnection c); @Override protected void onCreate(Bundle savedInstanceState) { ... binding = ActivityMainBinding.inflate(getLayoutInflater()); inputEnabledTextView = binding.inputEnabledTextView; inputEnabledTextView.createInputConnection(InputType.TYPE_CLASS_TEXT); setInputConnectionNative(inputEnabledTextView.mInputConnection); }
C kitaplığınızda
inputConnection
değeriniGameTextInput_setInputConnection
hesabına aktarın. C durumu yapısıGameTextInputState
olarak etkinlikler hakkında bildirim almak içinGameTextInput_setEventCallback
içinde geri çağırma iletin.extern "C"JNIEXPORT void JNICALL Java_com_gametextinput_testbed_MainActivity_setInputConnectionNative( JNIEnv *env, jobject this, jobject inputConnection) { GameTextInput_setInputConnection(gameTextInput, inputConnection); GameTextInput_setEventCallback(gameTextInput,[](void *ctx, const GameTexgtInputState *state) { if (!env || !state) return; // process the newly arrived text input from user. __android_log_print(ANDROID_LOG_INFO, "TheGreateGameTextInput", state->text_UTF8); }, env); }
Uygulamanızın durum değiştiğinde etkinlikleri işlemesi için C kitaplığınızda, önceki adımda kaydedilen geri çağırmanızı dahili olarak çağıran
GameTextInput_processEvent
yöntemini çağırın.extern "C" JNIEXPORT void JNICALL Java_com_gametextinput_testbed_InputEnabledTextView_onTextInputEventNative( JNIEnv* env, jobject this, jobject soft_keyboard_event) { GameTextInput_processEvent(gameTextInput, soft_keyboard_event); }
Yardımcı işlevler
GameTextInput
kitaplığı, Java durumu nesneleri ile C durumu struct'ları arasında dönüşüm yapmanızı sağlayan yardımcı program işlevleri içerir. GameTextInput_showIme
ve GameTextInput_hideIme
işlevleri aracılığıyla IME'yi gösterme ve gizleme işlevine erişin.
Referanslar
Geliştiriciler GameTextInput
ile uygulama oluştururken aşağıdaki bilgileri faydalı bulabilirler:
- GameTextInput test uygulaması
- GameTextInput ile GameActivity'yi kullanma
- GameTextInput Referans belgesi
- GameTextInput kaynak kodu
Geri bildirim
GameTextInput
ile ilgili soru ve sorunlarınız için Google IssueTracker'da hata kaydı oluşturun.