GameTextInput Bagian dari Android Game Development Kit.
Menggunakan library GameTextInput
adalah
cara lain yang lebih sederhana untuk menulis aplikasi Android layar penuh yang menggunakan keyboard
virtual untuk input teks.
GameTextInput
menyediakan API yang mudah digunakan untuk menampilkan atau menyembunyikan keyboard
virtual, menetapkan atau mendapatkan teks yang saat ini sedang diedit, dan menerima notifikasi saat
teks diubah. Hal ini tidak dimaksudkan untuk aplikasi editor teks lengkap, tetapi
masih memberikan dukungan region pemilihan dan penulisan untuk kasus penggunaan umum dalam
game. Selain itu, library ini juga mendukung fitur editor metode input
(IME) lanjutan seperti pemeriksaan
ejaan, pelengkapan, dan karakter multi-kunci.
Secara internal, GameTextInput
mengumpulkan teks input (bersama dengan
status yang relevan) ke buffer internal GameTextInput::currentState_
dan memberi tahu
aplikasi dari setiap perubahan di dalamnya. Aplikasi kemudian melakukan pemrosesan teks di
fungsi callback yang terdaftar.
Ketersediaan
GameTextInput
dapat digunakan dengan cara berikut:
Bersama dengan GameActivity: GameActivity mengintegrasikan GameTextInput. Aplikasi yang menggunakan GameActivity hanya dapat menggunakan GameTextInput. Petunjuk penggunaan didokumentasikan secara lengkap di halaman GameActivity . Untuk contoh integrasi GameActivity dan GameTextInput, lihat repositori game-samples. Model penggunaan ini tidak termasuk dalam cakupan panduan ini.
Sebagai library mandiri: bagian lainnya dalam panduan ini akan menjelaskan langkah-langkah penggunaan.
Perhatikan bahwa kedua metode di atas sama-sama bersifat eksklusif.
Rilis GameTextInput
formal tersedia di saluran berikut:
- Rilis library game Jetpack di Google Maven
- Rilis file ZIP di halaman download AGDK
Panduan ini membahas kasus penggunaan pertama. Untuk menggunakan rilis file ZIP, lihat instruksi yang dikirimkan di dalam paket.
Menyiapkan build
GameTextInput
didistribusikan sebagai Android Archive (AAR). AAR ini berisi class Java dan
kode sumber C, yang mengimplementasikan fitur native GameTextInput
. Anda
perlu menyertakan file sumber ini sebagai bagian dari proses build Anda melalui
Prefab
,
yang mengekspos library native dan kode sumber ke project CMake atau build NDK.
Ikuti petunjuk di Game Jetpack Android untuk menambahkan Dependensi library
GameTextInput
ke filebuild.gradle
game Anda. Catatan jika aplikasi Anda menggunakan GameActivity, aplikasi tidak dapat menggunakan libraryGameTextInput
mandiri.Pastikan
gradle.properties
berisi baris berikut:# 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
Impor paket
game-text-input
dan tambahkan ke target Anda di fileCMakeLists.txt
project:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)
Di salah satu file
.cpp
di game Anda, tambahkan baris berikut untuk menyertakan penerapanGameTextInput
:#include <game-text-input/gametextinput.cpp>
Di file sumber yang menggunakan
GameTextInput
C API, sertakan header-nya file:#include <game-text-input/gametextinput.h>
Mengompilasi dan menjalankan aplikasi. Jika Anda memiliki error CMake, verifikasi file AAR dan
build.gradle
yang telah disiapkan dengan benar. Jika file#include
tidak ditemukan, verifikasi file konfigurasiCMakeLists.txt
Anda.
Mengintegrasikan build
Dari thread C yang sudah terpasang ke JVM, atau dari bagian utama aplikasi rangkaian pesan, panggil
GameTextInput_init
dengan pointerJNIEnv
.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); ... }
Buat class Java
InputEnabledTextView
dengan akses keInputConnection
.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); }
Tambahkan
InputEnabledTextView
yang dibuat ke tata letak UI. Misalnya, kode berikut diactivity_main.xml
dapat menempatkannya di bagian bawah layar:<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" />
Ambil class
InputEnabledTextView
baru ini ke aktivitas Java Anda. Ini adalah relatif sederhana saat Anda menggunakan View Binding: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); }
Di library C, teruskan
inputConnection
keGameTextInput_setInputConnection
. Meneruskan callback masukGameTextInput_setEventCallback
untuk menerima notifikasi peristiwa sebagai C state structGameTextInputState
.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); }
Di pustaka C Anda, panggil
GameTextInput_processEvent
, yang secara internal memanggil callback Anda yang terdaftar di langkah sebelumnya, untuk aplikasi Anda untuk menangani peristiwa saat status berubah.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); }
Fungsi utilitas
Library GameTextInput
menyertakan fungsi utilitas yang memungkinkan Anda mengonversi
objek status Java dan struktur status C. Akses fungsionalitas untuk menampilkan
dan menyembunyikan IME melalui GameTextInput_showIme
dan GameTextInput_hideIme
fungsi-fungsi lainnya.
Referensi
Hal berikut mungkin berguna bagi developer saat membuat aplikasi dengan
GameTextInput
:
- Aplikasi pengujian GameTextInput
- Menggunakan GameTextInput dengan GameActivity
- Dokumen Referensi GameTextInput
- Kode sumber GameTextInput
Masukan
Jika ada masalah dan pertanyaan terkait GameTextInput
, buat
bug di IssueTracker Google.