GameTextInput חלק מ-Android Game Development Kit.
השימוש בספרייה GameTextInput הוא חלופה פשוטה יותר לכתיבת אפליקציית Android למסך מלא שמשתמשת במקלדת הווירטואלית להזנת טקסט.
GameTextInput מספק API פשוט להצגה או להסתרה של המקלדת הרכה, להגדרה או לקבלת הטקסט שנערך כרגע ולקבלת התראות כשהטקסט משתנה. התכונה הזו לא מיועדת לאפליקציות עריכת טקסט מלאות, אבל היא עדיין מספקת תמיכה באזור בחירה ובאזור כתיבה לתרחישי שימוש טיפוסיים במשחקים. בנוסף, הספרייה הזו תומכת בתכונות מתקדמות של עורך שיטות קלט (IME), כמו בדיקת איות, השלמות ותווים עם כמה מקשים.
באופן פנימי, GameTextInput צובר את טקסט הקלט (יחד עם המצבים הרלוונטיים) במאגר הפנימי GameTextInput::currentState_ ומודיע לאפליקציה על כל שינוי שמתרחש בו. לאחר מכן האפליקציה מבצעת עיבוד טקסט בפונקציית הקריאה החוזרת הרשומה שלה.
זמינות
אפשר להשתמש ב-GameTextInput בדרכים הבאות:
יחד עם GameActivity: GameActivity משלב GameTextInput. באפליקציות שמשתמשות ב-GameActivity אפשר להשתמש רק ב-GameTextInput המשולב. הוראות השימוש מתועדות באופן מלא בדף GameActivity . דוגמה לשילוב של GameActivity ו-GameTextInput זמינה במאגר games-samples. מודל השימוש הזה לא נכלל במדריך הזה.
כספרייה עצמאית: שאר המדריך מתאר את שלבי השימוש.
חשוב לזכור שאי אפשר להשתמש בשתי השיטות שצוינו למעלה בו-זמנית.
גרסאות רשמיות של GameTextInput זמינות בספריית המשחקים של Jetpack בגרסה Google Maven.
הגדרת ה-build
GameTextInput מופץ כארכיון Android (AAR). קובץ ה-AAR הזה מכיל את מחלקות Java ואת קוד המקור של C, שמטמיע את התכונות המקוריות של GameTextInput. צריך לכלול את קובצי המקור האלה כחלק מתהליך הבנייה באמצעות Prefab, שחושף ספריות Native וקוד מקור לפרויקט CMake או ל-NDK build.
פועלים לפי ההוראות בדף Jetpack Android Games כדי להוסיף את התלות בספרייה
GameTextInputלקובץbuild.gradleשל המשחק. הערה: אם האפליקציות שלכם משתמשות ב-GameActivity, אי אפשר להשתמש בספרייתGameTextInputהעצמאית.מוודאים שהקובץ
gradle.propertiesמכיל את השורות הבאות:# 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ומוסיפים אותה ליעד בקובץCMakeLists.txtשל הפרויקט:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)באחד מקובצי
.cppבמשחק, מוסיפים את השורה הבאה כדי לכלול את ההטמעה שלGameTextInput:#include <game-text-input/gametextinput.cpp>בקובצי המקור שמשתמשים ב-
GameTextInputC API, צריך לכלול את קובץ הכותרת:#include <game-text-input/gametextinput.h>קומפילציה והרצה של האפליקציה. אם יש שגיאות ב-CMake, צריך לוודא שהקבצים AAR ו-
build.gradleמוגדרים בצורה תקינה. אם הקובץ#includeלא נמצא, צריך לאמת את קובץ התצורהCMakeLists.txt.
שילוב של הגרסה
משרשור C שכבר מצורף ל-JVM, או מהשרשור הראשי של האפליקציה, קוראים ל-
GameTextInput_initעם מצביעJNIEnv.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); ... }יוצרים מחלקת Java עם גישה ל-
InputConnection.InputEnabledTextViewpublic 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); }מוסיפים את
InputEnabledTextViewשנוצר לפריסת ממשק המשתמש. לדוגמה, הקוד הבא ב-activity_main.xmlיכול למקם את המודעה בתחתית המסך:<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" />מאחזרים את המחלקה החדשה
InputEnabledTextViewלפעילות Java. התהליך הזה פשוט יחסית כשמשתמשים ב-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); }בספריית C, מעבירים את
inputConnectionאלGameTextInput_setInputConnection. מעבירים קריאה חוזרת ב-GameTextInput_setEventCallbackכדי לקבל התראה על אירועים כמבנה מצב CGameTextInputState.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); }בספריית C, קוראים ל-
GameTextInput_processEvent, שקוראת באופן פנימי לקריאה החוזרת שרשומה בשלב הקודם, כדי שהאפליקציה תטפל באירועים כשמצב ההפעלה משתנה.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); }
פונקציות בסיסיות
הספרייה GameTextInput כוללת פונקציות עזר שמאפשרות לכם להמיר בין אובייקטים של מצב Java לבין מבני מצב C. אפשר לגשת לפונקציות להצגה ולהסתרה של ה-IME באמצעות הפונקציות GameTextInput_showIme ו-GameTextInput_hideIme.
קובצי עזר
מפתחים יכולים להיעזר במידע הבא כדי ליצור אפליקציות באמצעות GameTextInput:
- אפליקציית הבדיקה GameTextInput
- שימוש ב-GameTextInput עם GameActivity
- מסמך עזר בנושא GameTextInput
- קוד המקור של GameTextInput
משוב
אם יש לכם בעיות או שאלות לגבי GameTextInput, אתם יכולים ליצור באג ב-Google IssueTracker.